如何理解javascript中的闭包

WEB前端 waitig 372℃ 百度已收录 0评论

三种简洁解释:1.如果一个函数访问了他的外部变量,那么它就是一个闭包。

 2.闭包就是一个函数把外部的那些不属于自己的对象也包含(闭合)进来了。

3.JavaScript中的闭包,无非就是变量解析的过程

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

看个简单版的例子:

(function(){
    var hello="hello 闭包";
    function gogo(hi){
        alert(hi);        //解析到作用域链的第一个对象的属性
        alert(hello);    //解析到作用域链的第二个对象的属性
    }
    gogo("理解闭包");
})();

运行结果很简单,一个弹窗理解闭包。 一个弹窗hello 闭包
分析过程如下:
对于函数gogo(),定义gogo的时候会产生一个作用域链对象,为了表示方便,记作scopechain。scopechain是个有顺序的集合对象。

  • scopechain的第一个对象:为了方便表示记作sc1, sc1有若干属性,引用本函数的参数和局部变量,如sc1.hi ;
  • scopechain的第二个对象:为了方便表示记作sc2,sc2有若干属性,引用外层函数的参数和局部变量,如sc2.hello;
  • scopechain的最后一个对象:为了方便表示记作scn,scn引用的全局的执行环境对象,也就是window对象!,如scn.eval();

这里之所以可以弹出hello 闭包,原因就是变量解析时在gogo函数作用域链的第一个对象上找不到hello属性,然后就去第二个对象上找去了(结果还真找到了)。

所以,JavaScript中的所谓的高大上的闭包其实很简单,根本上还是变量解析。而之所以可以实现,还是因为变量解析会在作用域链中依次寻找对应属性的导致的。


本文由【waitig】发表在等英博客
本文固定链接:如何理解javascript中的闭包
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)