let & const

let

不存在变量提升

let 在ES6中可以和强类型语言一样的声明方法, 需要先声明才能使用, 即不存在变量提升.

temporal dead zone

var test = 123;
if (1) {
  test = 456;  //  error; undefined
  let test;
}

我是这么理解的: 块级作用域中存在let声明, 会使关于test的上下文block, 所以外部赋值不生效

不允许重复定义

function a () {
  let a;
  let a; // error
}

关于顶层对象

一方面规定, var命令和function命令声明的全局变量,依旧是顶层对象的属性;
另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性

//    in browser unrestricted mode
var foo1 = 'bar';
let foo2 = 'bar';
console.log(window.foo1);    //    bar
console.log(window.foo2);    //    undefined

块级作用域

function f() {
  var arr = ['red', 'green', 'blue'];
  var result = [];
  for (var i = 0; i < arr.length - 1; i++) {
    var func = function() {
      //  i inherit from outer funciton scope
      return arr[i];
    };
    result.push(func);
  }
  return result;
}

console.log(f()[0]());

//  example from: http://2ality.com/2011/02/javascript-variable-scoping-and-its.html

很早之前知道怎么解决这个问题, 但是忘记了为什么

f()执行之后, for循环中function赋予, 里面的`arr[i]`中`i`执行完之后已经变成了3

又因为`i`是var定义出来的, 所以是function scope.

因此, 结果为blue

results matching ""

    No results matching ""