1. 闭包概念
function foo() {
var a = 2; //let a = 2;
function bar() {
console.log( a );
}
return bar;
}
var baz = foo();
baz(); // 2 -- 哇噢,看到闭包了,伙计。
bar() 依然拥有对那个作用域的引用,而这个引用称为闭包
无论我们使用什么方法将内部函数 传送 到它的词法作用域之外,它都将维护一个指向它最开始被声明时的作用域的引用,而且无论我们什么时候执行它,这个闭包就会被行使
2. 一个很好的例子
不使用闭包
for (var i=1; i<=5; i++) {
setTimeout( function timer(){
console.log( i );
}, i*1000 );
}
//6,6,6,6,6
使用闭包
for (var i=1; i<=5; i++) {
(function(){
var j = i;
setTimeout( function timer(){
console.log( j );
}, j*1000 );
})();
}
//1,2,3,4,5
3. 重温块儿作用域
for (var i=1; i<=5; i++) {
let j = i; // 呀,给闭包的块儿作用域!
setTimeout( function timer(){
console.log( j );
}, j*1000 );
}
//1,2,3,4,5
for (let i=1; i<=5; i++) {
setTimeout( function timer(){
console.log( i );
}, i*1000 );
}
//1,2,3,4,5
以上参考《你不知道的JS》,代码结果已经经过验证。
总结:从以上示例来看:
- 函数内可形成一个封闭的作用域,外部不可访问;同时形成闭包,无论函数在何处被调用,它都将维护一个指向它最开始被声明时的作用域的引用。
-
let
关键字将变量声明附着在它所在的任何块儿(通常是一个{ .. }
)的作用域中,这个块作用域外部不可访问。
网友评论