JavaScript闭包(Closure)

@wanqiuz 2018-04-24 06:56:45发表于 wanqiuz/blog-articles JavaScriptclosure闭包

1 什么是闭包

闭包是定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。

2 为什么需要闭包

局部变量无法共享和保存,全局变量会污染,希望有一种长久的机制可以保存变量又不会污染全局。

3 理解闭包

JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。

短答案:JavaScript中的闭包,无非就是沿着作用域链进行变量解析的过程。首先看一段话:

每次定义一个函数,都会产生一个作用域链(scope chain)。当JavaScript寻找变量varible时(这个过程称为变量解析),总会优先在当前作用域链的第一个对象中查找属性varible ,如果找到,则直接使用这个属性;否则,继续查找下一个对象的是否存在这个属性;这个过程会持续直至找到这个属性或者最终未找到引发错误为止。

看个简单版的例子:

(function(){
    var hello="hello,world";
    function welcome(hi){
        alert(hi);        //解析到作用域链的第一个对象的属性
        alert(hello);    //解析到作用域链的第二个对象的属性
    }
    welcome("It's easy");
})();

4 闭包的缺点

占用更多内存,容易造成内存泄露。