zoukankan      html  css  js  c++  java
  • let命令和块级作用域

    学习了阮一峰老师的ES6,http://es6.ruanyifeng.com/,收益良多。

    一、let命令
    1、概念:let命令用于声明变量,和var类似,但是使用let命令所声明的变量只有在该变量所在的代码块内生效。
    2、使用:适用于for循环的变量声明。

    for (let i = 0;i < 10;i++) {
      let i = "a";    
    }
    // for循环里面的两个i是不同的,并且属于不同的作用域。第一个i属于是for循环的循环变量的父作用域,第二个i属于是for循环的循环体的一个单独的子作用域。
    console.log(i);    // ReferenceError: i is not defined

    3、与ES5的区别:
    (1)ES6中的let命令不存在变量提升的问题。ES5中变量可以在声明之前使用,值为undefined。

    // ES5:
    console.log(example);    // undefined
    var example = "hello world";
    
    // ES6:
    console.log(example);    // ReferenceError: example is not defined
    let example = "hello world";

    (2)暂时性死区。在代码块中,使用let命令所声明的变量在声明之前都是不可用的。在语法上,称为“暂时性死区”(temporal dead zone)TDZ。

    {
        // 死区开始 -> 代码块的开始
        console.log(temp);
        let temp = "";	// 死区结束 -> 使用let变量声明了temp
    }

    (3)不允许重复声明。

    function fun1() {
      let a = "1";
      var a = "2";	
    }
    
    fun1();	// Identifier 'a' has already been declared
    
    function fun2() {
      let a = "1";
      let a = "2";	
    }
    
    fun2();	// Identifier 'a' has already been declared

    二、块级作用域
    1、为什么需要块级作用域?
    (1)内层变量可能会覆盖外层变量。
    (2)用来计数的循环变量泄露为全局变量。

    var date = new Date();
    
    function f() {
      console.log(date);
      if (false) {
        var date = "hello world";
      }
    }
    // if代码块的外部使用内层的date变量,内部使用内层的date变量。但是,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的date变量覆盖了外层的date变量。
    f();	// undefined
    
    // 用来计数的循环变量泄露为全局变量
    var str = 'hello world';
    for (var i = 0;i < str.length;i++) {
      // ...
    }
    // console.log(i);	// 5
  • 相关阅读:
    一、列表
    正则表达式
    form表单学习
    HTTP场景应用
    fiddler几种功能强大的用法(二)
    在VMW里安装Ghost操作系统遇到的问题及解决的办法
    浮点数值的表示
    补码和补码的计算
    个人主页项目总结
    Todolist项目总结 JavaScript+jQuery
  • 原文地址:https://www.cnblogs.com/chenjie00/p/8761610.html
Copyright © 2011-2022 走看看