一些没注意的点

作者: JaniceZD | 来源:发表于2019-04-03 16:38 被阅读1次

    本文将持续更新前端学习中遇到的一些问题,以及需要注意的点。

    1. let 命令

    ES6 新增了 let 命令,用来声明变量。它的用法类似于 var,但是所声明的变量,只在 let 命令所在的代码块内有效。

    {
      let a = 10;
      var b = 1;
    }
    
    a // ReferenceError: a is not defined.
    b // 1
    

    这表明,let 声明的变量只在它所在的代码块有效。

    for 循环的计数器,就很合适使用 let 命令。

    for (let i = 0; i < 10; i++) {
      // ...
    }
    
    console.log(i);
    // ReferenceError: i is not defined
    

    上面代码中,计数器 i 只在 for 循环体内有效,在循环体外引用就会报错。

    • 不存在变量提升
      var 命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined
      为了纠正这种现象,let 命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
    • 暂时性死区
      只要块级作用域内存在 let 命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
      ES6 明确规定,如果区块中存在 letconst 命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
      总之,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
    var tmp = 123;
    
    if (true) {
      tmp = 'abc'; // ReferenceError
      let tmp;
    }
    

    上面代码中,存在全局变量 tmp,但是块级作用域内 let 又声明了一个局部变量 tmp,导致后者绑定这个块级作用域,所以在 let 声明变量前,对 tmp 赋值会报错。

    • 不允许重复声明
      let 不允许在相同作用域内,重复声明同一个变量。

    2. 对象属性的读取

    读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。

    var obj = {
      p: 'Hello World'
    };
    
    obj.p // "Hello World"
    obj['p'] // "Hello World"
    

    请注意,如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。

    var foo = 'bar';
    
    var obj = {
      foo: 1,
      bar: 2
    };
    
    obj.foo  // 1
    obj[foo]  // 2
    

    注意,数值键名不能使用点运算符(因为会被当成小数点),只能使用方括号运算符。

    var obj = {
      123: 'hello world'
    };
    
    obj.123 // 报错
    obj[123] // "hello world"
    

    上面代码的第一个表达式,对数值键名 123 使用点运算符,结果报错。第二个表达式使用方括号运算符,结果就是正确的。

    3. Array 对象的方法 forEach()

    forEach 方法将数组的所有成员依次传入参数函数,并依次执行。
    forEach 方法接受一个函数作为参数。该函数调用时,forEach 方法向它传入三个参数:当前值、当前位置、整个数组。

    function log(element, index, array) {
      console.log('[' + index + '] = ' + element);
    }
    
    [2, 5, 9].forEach(log);
    // [0] = 2
    // [1] = 5
    // [2] = 9
    

    相关文章

      网友评论

        本文标题:一些没注意的点

        本文链接:https://www.haomeiwen.com/subject/odyzbqtx.html