`
lbmydream
  • 浏览: 17120 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入理解javascript闭包

阅读更多
   对于javascript闭包的理解纠结了一段时间,总是没有理解透彻,现参考资料终于理解清楚,原来闭包是这样简单。
   首先,我们知道函数对象可以通过作用域链关联起来,函数体内的变量可以保存在函数作用域链内,该种特性在计算机学中称为“闭包”。
   要理解闭包我们需要理解javascript的作用域链和词法作用域规则。
   javascript每一段代码都有一个与之对应的作用域链,该作用域链是一个对象或者链表。javascript需要查找变量x的值时,会从作用域链第一个对象开始查找。在javascript的顶层代码(不包含函数定义的代码)作用域链由一个全局变量组成;对于无嵌套函数的函数定义,作用域链有两个对象,一个是函数局部对象,另一个是全局对象;在一个嵌套函数定义下,作用域链至少有3个对象。当定义一个函数时,实际是保存一个作用域链,当调用函数时会创建一个新的对象保存函数变量并将函数对象添加到这个作用域链上,同时创建一个更长的新的作用域链用以表示函数调用的作用域链,即每次函数调用的作用域链都不相同。
    javascript采用词法作用域,即函数执行依赖于函数变量作用域,这个作用域是在函数定义时决定而不是函数调用时决定。
    首先我们看下例子:
    var scope = "this is a globle scope.";//定义全局对象
    function chkscope(){
       var scope = "this is a local scope."//定义局部变量
        function f(){
          return scope;
       }
       f();
    }
    chkscope();
    当执行最后一行代码后返回"this is a local scope."大家应该都会很清楚其原因:局部变量优先级高于全局变量。但是我们将代码调整一下
     var scope = "this is a globle scope.";//定义全局对象
    function chkscope(){
       var scope = "this is a local scope."//定义局部变量
        function f(){
          return scope;
       }
       f;
    }
    chkscope()();
    将函数体内f后的一对圆括号调整到代码最后,代码执行到最后一行也是返回"this is a local scope.",嵌套在函数体内的作用域链的变量始终是局部变量,即无论f何时调用返回的始终是local。
     这就是之前困扰我的地方。大多数可能会和我一个这样理解,在外部函数调用返回后外部函数创建的局部变量会立即消失,代码执行到最后一行应该返回undenifined。其实从作用域链和javascript词法作用域以及程序底层运行来看不难理解。从前面我们知道函数运行用到作用域链,而函数作用域链由函数定义决定。如果函数局部变量存放栈中,外部函数调用返回时函数局部变量肯定会立即消失,但是从作用域链的定义知道,函数定义时是将变量存放在对象中并且添加到对应作用域链上,如果没有引用指向对象,对象会被当做垃圾回收掉。回到闭包定义,函数对象通过作用域链互相关联起来,即每一个定义的嵌套函数都对应各自的作用域链,这些作用域链都指向该绑定变量。如果没有外部引用指向这些作用域链,那么外部函数调用返回时,他们也会和这个变量绑定对象一起删除,但是嵌套函数将该对象值作为返回值或者存放在某个属性中,此时就有一个外部引用指向嵌套函数对应的作用域链,嵌套函数和局部变量绑定对象都不会被删除,因此嵌套在函数体内的作用域链的变量始终是局部变量,即,无论f何时调用返回的始终是local。
     理解重点:作用域链创建时机  局部变量绑定对象 词法作用域规则  底层运行机制
分享到:
评论

相关推荐

    深入理解JavaScript系列

    深入理解JavaScript系列(16):闭包(Closures) 深入理解JavaScript系列(17):面向对象编程之一般理论 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 深入理解JavaScript系列(19):求值策略...

    深入理解javascript原型和闭包

    深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系

    javascript深入理解js闭包.docx

    javascript深入理解js闭包.docx

    深入理解Javascript闭包 新手版

    最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业。对于初学者来说别说理解闭包了,就连文字叙述都很难看懂。撰写此文的目的就是用最通俗的文字揭开Javascript闭包的真实面目。

    深入理解javascript原型和闭包.pdf

    javascript原型和闭包

    深入理解JavaScript的闭包技术整理.pdf

    深入理解JavaScript的闭包技术整理.pdf

    深入理解_JavaScript_闭包

    理解 JavaScript 闭包 要成为高级 JavaScript 程序员,就必须理解闭包

    深入理解JavaScript 闭包究竟是什么

    本篇文章,小编一起和大家探讨JavaScript 闭包究竟是什么,有需要的朋友可以参考一下

    深入理解JavaScript系列(.chm)

    深入理解JavaScript系列(16):闭包(Closures) 深入理解JavaScript系列(17):面向对象编程之一般理论 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 深入理解JavaScript系列(19):求值策略...

    JavaScript闭包深入理解.pdf

    JavaScript闭包深入理解.pdf

    JavaScript闭包

    Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态...本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来使读者可以更深入的理解闭包。

    javascript闭包详解中文word版

    本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAscript语言规范来使读者可以更深入的理解闭包。闭包是Closure, 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    深入理解javascript原型和闭包1

    在咱们的第一节(深入理解javascript原型和闭包(1)——一切都是对象)中说道,函数也是一种对象。他也是属性的集合,你也可以对函数进行自定义属性。不用等咱

    理解_JavaScript_闭包

    本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。

    理解 JavaScript 闭包

    本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。

    [深入理解JS闭包]帮助你快速学习js的闭包,简单高效的文档资源

    帮助你快速学习js的闭包,简单高效的文档资源! 一、变量的作用域 二、如何从外部读取局部变量? 三、闭包的概念 四、闭包的用途 五、使用闭包的注意点 六、思考题 JavaScript闭包例子

    深入浅出理解JavaScript闭包的功能与用法

    主要介绍了深入浅出理解JavaScript闭包的功能与用法,结合实例形式从变量、函数的内部属性与作用域链分析了javascript闭包的相关概念、功能与使用技巧,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics