javascript闭包(closure)

概念:闭包是指有权访问另一个函数作用域中的变量的函数创建闭包的常见方式,就是在一个函数内部创建另一个函数。函数内部创建的函数,可以访问该函数的作用域,这个内部函数就叫做闭包,是函数内部和函数外部建立连接的桥梁。

最简单的例子:

function a() {
    var a = "hello"; // a函数内的局部变量
    
    function b() { // 函数内部的函数,函数b就是闭包
        console.log(a); // 通过b函数访问a函数内的局部变量a
    }
    
    return b; // 关键,返回b函数
}

运行:

a()(); // 结果是"hello"

分析:

1.因为函数b在函数a的内部,所以函数a中所有的局部变量对于b函数都是可见的,这是由javascript语言特有的“链式作用域(chain scope)”结构特性决定的,子对象会一级一级地向上寻找所有父对象的变量,直到找到为止。内部函数b的作用域链中包含了外部函数a的作用域。而通过由返回函数b达到访问函数a中的局部变量的效果。

2.因为函数a是函数b的父函数,而函数b被赋给了一个全局变量,导致了函数b始终在内存中,而函数b的存在依赖于函数a,导致函数a也始终在内存中,不会在调用结束后被垃圾回收机制(garbage collection)回收。使用闭包会使得函数中的变量都被保存在内存中,内存消耗很大,滥用闭包可能会导致网页性能问题,解决方法是在退出函数前将不使用的局部变量全部删除(给变量赋值undefined)。

"林深时雾起,海深时浪涌,梦醒时夜续,我不见鹿,不见鲸,也不见你。"

原文地址:https://www.cnblogs.com/yanggb/p/8948370.html