闭包与作用域
作用域 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