JacaScript 闭包(二)闭包与变量


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

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的值是在每次循环的时候传入的。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我发现自己好久都没有认真的晒娃并唠娃了,今天中午儿子午睡的时候,我就想着打开电脑写点儿啥吧!可能他还没睡熟的缘故,...
    小确幸咩阅读 591评论 0 0
  • 近日因为和一位朋友聊天的内容,让我不禁想起《廉颇蔺相如列传》中的一个故事。赵惠文王的宦者令缪贤向赵王推荐他的门客蔺...
    兔子三阅读 436评论 0 0
  • 预期效果:方便、简单调用,能够定位具体的请求并cancel;思路:类A做具体的请求事件,类B调用类A处理一些业务逻...
    骑蜗牛兜风阅读 290评论 0 0
  • 前几天我姐姐组织了一个学习时间管理100讲践行群。每天也和易效能践行群里一样早起打卡。但是要求必须听完后写完...
    一然66阅读 635评论 0 2