闭包与作用域

Posted by Jianing on March 25, 2020

闭包与作用域

作用域 scope

作用域查找会在找到第一个匹配的标识符时停止。

全局

  • var的变量提升

函数

  • 函数内部可以访问外部的变量,反之不然。

块作用域

  • let / const
  • for 循环头部的let声明其实在每一次循环时都重新声明了变量,并用上一次迭代结束时的值赋值。
1
2
3
4
5
6
7
8
function testLoop(){
    for(let i = 0; i < 6; i++){	//将此块转化为作用域
		setTimeout(function printNum(){
            console.log(i);
        },i*1000);
    }
}
testLoop();

未声明的变量?

  • 使用一个没有声明过的变量,会得到一个ReferenceError。无论何时。
  • undefined 是给未赋值的变量的默认值。

闭包

  • 函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包
  • 该环境包含了这个闭包创建时作用域内的任何局部变量。
  • :pear: add5 的实例维持了一个对它的词法环境(变量 x 存在于其中)的引用。
1
2
3
4
5
6
7
8
9
10
11
function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

var add5 = makeAdder(5);
var add10 = makeAdder(10);

console.log(add5(2));  // 7
console.log(add10(2)); // 12