【问题标题】:What does the return statement do in this closure?return 语句在这个闭包中做了什么?
【发布时间】:2016-01-24 04:08:30
【问题描述】:
function buildFunctions(){
    var arr = [];

    for (var i = 0; i < 3; i++){
        (function(j){
            arr.push(function(){
                console.log(j);
            });
        })(i);
    }   

    return arr;
}

在上面的函数中,每次 for 循环运行时,它都会为 IIFE 创建一个新的执行上下文(在 for 循环中调用)。然后在 IIFE 内部,它将在数组内部推送一个函数。下一次 for 循环运行时,它将再次为 IIFE 的另一个调用创建一个新的执行上下文。

我的问题是第一次调用 IIFE 的执行上下文会发生什么?它仍然存在于内存中还是从执行堆栈中弹出?由于 IIFE 内部没有 return 语句,因此 for 循环中对 IIFE 的每次调用都会有三个相互叠加的执行上下文堆栈。

然后我假设当return arr;buildFunctions 中被调用时,这三个 IIFE 的执行上下文被弹出正确的时间?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    会发生这样的事情:

    当您执行var someVar = buildFunctions() 时,它会将一个包含3 个不同 匿名函数的数组分配给someVar

    每个都有自己的上下文,其中j 的值分别等于 0、1 和 2。

    • 如果您曾经调用过someVar[0]();,它将输出0
    • 如果您曾经调用过someVar[1]();,它将输出1
    • 如果你曾经调用过someVar[2]();,它将输出2

    在这里你可以看到数组和someVar[0]'s Closure where j = 0 in chrome's console:

    【讨论】:

    • 每个推送的函数都有自己的上下文。他们没有参考任何东西,特别是没有参考其他函数的上下文。当任何推入的 fn 被执行时,它会保留在它的执行上下文中,其中包括一个名为 jlocal var,它的值已设置
    • 哦,好吧!但是数组中的每个匿名函数在执行时如何知道使用哪个 j 的值呢?
    • 因为每个函数都是在上下文中创建的(由 IIFE 创建)。该上下文定义了j 的值。您已经创建了 3 个不同的 j 变量,如果您修改其中一个,其他的保持不变。
    • 哦,好的。现在说得通了!感谢您的澄清!
    • 不客气。也许我创建的这个 jsfiddle 可以帮助你更多:) jsfiddle.net/jormaechea/euaf06x3/1
    猜你喜欢
    • 2014-12-22
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    相关资源
    最近更新 更多