JavaScript闭包

  • 函数内部可以访问全局变量
let a = 0;
function test(){
    console.log(a);
}
test();              //0
  • 函数外部不能访问函数内的变量
function test(){
    let a = 0;
}
console.log(a);      //"ReferenceError: a is not defined

作用域链:父对象的所有变量,对子对象都是可见的,反之不成立

function f1(){
    let n=1;
    function f2(){
      console.log(++n); 
    }
    f2();
}
f1();         //2
f1();           //2

函数f2定义在函数f1内部,根据作用域链,f2可以读取f1中的所有局部变量,那么只要把f2作为返回值,我们就可以在f1外部读取f1的内部变量

function f1(){
    let n=1;
    function f2(){
     console.log(++n); 
   }
   return f2;
}
let result=f1();
result();         // 2
result();         // 3

闭包的概念

JS闭包是指有权访问一个函数内部变量的函数,创建闭包的常见方式是在函数内部定义一个函数

用途:

  • 读取函数内部的局部变量
  • 变量的值保存在内存中,不会被垃圾回收机制回收

注意:

  • 消耗内存,在IE可能导致内存泄露

经典例题:

window.onload = function(){
    let aLi = document.getElementsByTagName('li');
    for (var i=0;i
    
  • 123
  • 456
  • 789
  • 参考文章推荐:
    详解js闭包
    学习Javascript闭包

    你可能感兴趣的:(JavaScript闭包)