美文网首页
JacaScript 闭包(二)闭包与变量


JacaScript 闭包(二)闭包与变量


作者: BertFu | 来源:发表于2016-11-21 01:06 被阅读16次

作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。闭包保存的是整个变量对象,而不是某个特殊的变量。

function createFunctions() {
    var result = new Array();

    for (var i = 0; i < 10; i++) {
        result[i] = function() {
            return i;
        }
    }

    return result;
}

上例会返回一个函数数组。表面上看,视乎每个函数都应该返回子的索引值,即位置0的函数返回0,位置1的函数返回1,以此类推。

但实际上,每个函数都返回10。因为每个函数走用于链中都保存着 createFunctions() 函数返回后,变量i的值是10,此时每个函数都引用着保存变量i的同一个变量对象,所以在每个函数内部i的值都是10.

但是,我们可以通过创建另一个匿名函数强制让闭包的行为符合预期值:

function createFunctions() {
    var result = new Array();

    for (var i = 0; i < 10; i++) {
        result[i] = function(num) {
            return function() {
                return num;
            }(i)
        }
    }

    return result;

}

上例中返回了一个匿名函数,且直接执行。

这样的情况就很有趣了,该函数内部返回一个匿名函数,这个匿名函数就具有闭包的效果,返回了父级自执行函数作用域中的 num。

而父级自执行函数在被赋值前先执行了,并传入了变量 i,所以在这个函数作用域里存储的是每次循环传入的变量 i,那么内部的返回的函数在执行时访问的 num 就是 i对应的值了。

这边有点绕,其实就是匿名函数访问的是外部函数的变量 num,而num是不变的,且num的值是在每次循环的时候传入的。

那么最内层的函数在执行时就不会出现前一个例子的范围外部函数作用域的变量被改变情况。

相关文章

  • JacaScript 闭包(二)闭包与变量


    作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。闭包保存的是整个变...

  • Python闭包

    闭包 = 环境变量 + 函数 调用闭包内部的环境变量 闭包的经典误区 闭包与非闭包实现人类走路 非闭包 闭包

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • rust 闭包与同步

    rust 闭包与同步 rust 闭包 rust闭包中主要包括两个部分,闭包参数和闭包环境变量。闭包函数和函数参数使...

  • groovy-闭包

    定义和执行闭包 闭包作为参数返回 闭包作为参数传递 闭包使用外部变量 注意: 闭包可使用(引用)闭包外部定义的变量...

  • 闭包与setTimeout

    闭包 闭包的作用: 闭包的本质是一个函数闭包可以访问函数内部变量闭包的存在会使内部变量保留在内存中闭包的应用: 模...

  • Swift-08:闭包

    1.分析闭包以及闭包捕获变量的原理2.逃逸闭包 & 非逃逸闭包 一、闭包 闭包是一个捕获了全局上下文的常量或者变量...

  • 2019-01-05 闭包

    内部函数和外部函数中被内部函数调用的变量组成了闭包。 例子:函数line与变量a构成了闭包。 1.闭包似优化了变量...

  • JS闭包问题(二)

    在之前的JS闭包问题(一)文章中大概介绍了一下JS闭包,同时讲了闭包与变量之间的问题,今天我们继续聊闭包,聊聊闭包...

  • JacaScript 闭包(一)什么是闭包

    之前傻傻分不清 匿名函数 和 闭包 这两个概念,因此经常混用。闭包 是指有权访问另一个函数作用域中的变量的函数。创...

网友评论

      本文标题:JacaScript 闭包(二)闭包与变量


      本文链接:https://www.haomeiwen.com/subject/ekaypttx.html