JavaScript闭包的理解

闭包是指有权访问另一个函数作用域中的变量的函数。

作用域

作用域分为全局作用域局部作用域

全局作用域:最外层函数定义的变量拥有全局作用域,任何内部函数都可以访问。
局部作用域:只在固定的代码片段内可以访问,函数外部无法访问。

全局变量都是全局对象window的一个属性。

作用域链

作用域链就是根据内部函数可以访问外部函数变量的这种机制,链式向上查找决定哪些数据可以被内部函数访问。
当某一个函数被调用时就会创建一个执行环境和相关作用域链

作用域链的用途,是保证有权访问当前执行环境的所有变量和函数的有序访问。

闭包

某些时候我们需要得到一个函数内部的局部变量,这时就需要用到闭包。
闭包是指有权访问另一个函数作用域中的变量的函数。
闭包的创建方式是在一个函数内部创建另一个函数。

function f1(){
   var n=999;
   function f2(){
       console.log(n);   //n=999;
   }
}

上面的函数中,f2被包含在f1内部,f2可以得到f1中的所有局部变量,但f1无法得到f2中的局部变量。
那么只要把f2作为返回值,就可以被f1获取。

function f1(){
   var n=999;
   function f2(){
       console.log(n);   //n=999;
   }
   return f2;
}
var result=f1(); //返回的是f2函数
result(); //999

这个f2函数就是闭包。

闭包的作用

闭包可以用来读取内部函数的变量,还可以让这些变量的值始终保存在内存中,不会在f1调用后被自动清除。

原因是f1是f2的父函数,f2被赋予了一个全局变量,所以f2始终在内存中。而f2的存在依赖于f1,所以f1也始终存在于内存中,不会在调用结束后被垃圾回收机制回收。

注意

注意在函数内部声明变量时要用var,否则声明的是一个全局变量。

闭包会使函数中的变量都被保存在内存中,消耗较大,所以不能滥用会造成网页性能问题。IE中可能导致内存泄露。解决方法:退出函数之前将不使用的局部变量全部删除。

猜你喜欢

转载自blog.csdn.net/lixinyi0622/article/details/84590638