资讯专栏INFORMATION COLUMN

你不知道的闭包

wwq0327 / 1193人阅读

摘要:前言这篇文章不是全面讲闭包知识的,而是针对那些已经对闭包有所了解但是还存在疑惑的人群。那么为什么能保存在函数变量里面的呢实现闭包闭包函数定义时的作用域链到函数执行时仍然有效。

前言

这篇文章不是全面讲闭包知识的,而是针对那些已经对闭包有所了解但是还存在疑惑的人群。比如:闭包为何能保存变量?接下来就详细讲述此类问题。以下内容来自犀牛书第六版。

正文 经典闭包案例

函数柯里化:

function curry(fn){
    var arg1 = Array.prototype.slice.call(arguments,1);
    return function(){
        var arg2 = Array.prototype.slice.call(arguments);
        var mergeArr = arg1.concat(arg2);
        return fn.apply(null,mergeArr);
    }
}

function add(num1,num2){ 
    return num1 + num2;
}

var curriedAdd = curry(add, 5); 
alert(curriedAdd(3)); // 8
疑惑

外部函数中定义的局部变量在函数返回之后就不存在了,那么嵌套的函数是如何调用不存在的作用域链的呢?如上面所示,调用curriedAdd()的时候,第一次传入的5是存在的。那么5为什么能保存在函数变量里面的呢?

实现闭包

闭包:函数定义时的作用域链到函数执行时仍然有效。

我们将函数作用域描述为一个对象列表,不是绑定的栈。每次调用javascript函数的时候,都会为之创建一个新的局部变量对象来保存局部变量,把这个对象添加至作用域链中。当函数返回的时候,就从作用域链中将这个绑定变量的对象删除。

1.如果不存在嵌套的函数,也没有其他引用指向这个绑定的对象,它就会被当做垃圾回收掉。
2.如果定义了嵌套的函数,每个嵌套的函数都各自对应一个作用域链,并且这个作用域链指向一个变量绑定对象。
(1)如果这些嵌套函数对象在外部函数中保存了下来(比如赋值给外部函数中的某个变量),它们也会和所指向的变量绑定对象一样当做垃圾回收
(2)但是如果这个函数定义了嵌套函数,并将它们作为返回值返回,或者存储在某处的属性里,这时就会有一个外部引用指向这个嵌套函数,它就不会被当做垃圾回收。并且它所指向的变量绑定对象也不会被当作垃圾回收。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86907.html

相关文章

  • 重读你不知道JS (上) 第一节五章

    摘要:词法作用域的查找规则是闭包的一部分。因此的确同闭包息息相关,即使本身并不会真的使用闭包。而上面的创建一个闭包,本质上这是将一个块转换成一个可以被关闭的作用域。结合块级作用域与闭包模块这个模式在中被称为模块。 你不知道的JS(上卷)笔记 你不知道的 JavaScript JavaScript 既是一门充满吸引力、简单易用的语言,又是一门具有许多复杂微妙技术的语言,即使是经验丰富的 Jav...

    worldligang 评论0 收藏0
  • [JS]《你不知道Javascript·上》——词法作用域和闭包

    摘要:吐槽一下,闭包这个词的翻译真是有很大的误解性啊要说闭包,要先说下词法作用域。闭包两个作用通过闭包,在外部环境访问内部环境的变量。闭包使得函数可以继续访问定义时的词法作用域。 闭包是真的让人头晕啊,看了很久还是觉得很模糊。只能把目前自己的一些理解先写下来,这其中必定包含着一些错误,待日后有更深刻的理解时再作更改。 吐槽一下,闭包这个词的翻译真是有很大的误解性啊…… 要说闭包,要先说下词法...

    guqiu 评论0 收藏0
  • 你不知道JavaScript:闭包

    摘要:回忆我一年前,虽然使用过很多,但却完全不理解闭包是什么。就算你,也会在循环完成时,输出次当然,不要以为主要的原因是延迟函数会在循环结束时才执行,不然我为什么会在闭包这一节用使用这个例子,哈哈。 前言 在了解闭包的概念时,我希望你能够有JavaScript词法作用域的知识,因为它会让你更容易读懂这篇文章。 感触 对于那些使用过JavaScript但却完全不理解闭包概念的人来说,理解闭包可...

    weknow619 评论0 收藏0
  • 你不知道JS》读书笔记---作用域及闭包

    摘要:注此读书笔记只记录本人原先不太理解的内容经过阅读你不知道的后的理解。作用域及闭包基础,代码运行的幕后工作者引擎及编译器。 注:此读书笔记只记录本人原先不太理解的内容经过阅读《你不知道的JS》后的理解。 作用域及闭包基础,JS代码运行的幕后工作者:引擎及编译器。引擎负责JS程序的编译及执行,编译器负责词法分析和代码生成。那么作用域就像一个容器,引擎及编译器都从这里提取东西。 ...

    denson 评论0 收藏0
  • 你不知道javascript》笔记_作用域与闭包

    摘要:建筑的顶层代表全局作用域。实际的块级作用域远不止如此块级作用域函数作用域早期盛行的立即执行函数就是为了形成块级作用域,不污染全局。这便是闭包的特点吧经典面试题下面的代码输出内容答案个如何处理能够输出闭包方式方式下一篇你不知道的笔记 下一篇:《你不知道的javascript》笔记_this 写在前面 这一系列的笔记是在《javascript高级程序设计》读书笔记系列的升华版本,旨在将零碎...

    galaxy_robot 评论0 收藏0

发表评论

0条评论

wwq0327

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<