function foo() {
var a = 2;
function bar() {
console.log( a );
}
return bar;
}
var baz = foo(); baz(); // 2 —— 朋友,这就是闭包的效果
函数baz持有对内部函数bar的引用,函数bar能够访问foo的内部作用域,foo 内部作用域本应该被销毁,闭包阻止了这一切。
闭包就是有权访问另一个函数内部变量的函数。
闭包产生的原因:内部函数存在对外部函数局部变量的引用就会导致闭包。
闭包实现方式
1.返回一个内部函数,像文章开头一样
2.回调函数
window.n = 999;
setTimeout(function f1(){
console.log(window.n);
},1000)
3.自执行函数
var n = 999;
(function f1(){
console.log(n);
})()
4.循环赋值
for(var i = 0; i<10; i++){
(function(j){
setTimeout(function(){ console.log(j); },1000)
})(i)
}
每个迭代都需要一个新的作用域,不然会共享同一个i变量。这里使用了立即执行函数在每次迭代创建新的作用域,同时传入参数,为创建的作用域添加变量。然后通过回调函数闭包的形式,获得每次迭代的值