函数闭包

70 阅读1分钟
 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变量。这里使用了立即执行函数在每次迭代创建新的作用域,同时传入参数,为创建的作用域添加变量。然后通过回调函数闭包的形式,获得每次迭代的值