js-闭包

了解闭包前,先了解变量:局部变量和全局变量。

var m = 100;
function f1(){
    console.log(m);
}
f1() // 100
//m为全局变量
function f2(){
    var n = 100;
}
f2();
console.log(n); //Uncaught ReferenceError: n is not defined
//n为局部变量
// ps:如果在函数里面,没有用var,实际上是定义了一个全局变量。如下:
function f3(){
    j = 100;
}
f3();
console.log(j); //100
//j为全局变量

接下来的问题是,如何从外部获取局部变量:

function f4(){
    var k = 100;
    function f5(){
        alert(k);
    }
    return f5;
}
f4()() //100

如上,f5可以读取f4中的局部变量,那么只要把f5作为返回值,我们就可以在f4外部读取它的内部变量(k)。f5就是闭包。

闭包的用途 :
闭包可以用在许多地方。它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
使用闭包的注意点:
1.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露(内存泄漏是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。)。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2.闭包会在父函数外部,改变父函数内部变量的值。

注意:
闭包并不会引起内存泄漏,只是由于IE9之前的版本对JScript对象和COM对象使用不同的垃圾收集,从而导致内存无法进行回收,这是IE的问题,所以闭包和内存泄漏没半毛钱关系。具体看这篇文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    zock阅读 1,085评论 2 6
  • 闭包: 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该...
    小裁缝sun阅读 644评论 0 5
  • 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变...
    紫陌兰溪阅读 292评论 0 4
  • 一、变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和...
    Bigbang_boy阅读 185评论 0 0
  • 在线全职这个模式就是用可靠的平台把设计师和雇主联系在一起,让雇主可以安心雇佣设计师,让设计师可以安心求职工作!设计...
    f1885e183ef3阅读 609评论 0 0