return语句在这个闭包中做了什么?

时间:2015-10-24 19:25:27

标签: javascript

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内部没有返回语句,因此在for循环中每次调用IIFE时都会有三个执行上下文堆叠在一起。

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

1 个答案:

答案 0 :(得分:1)

这就是:

当您执行var someVar = buildFunctions()时,它会将3个不同的匿名函数数组合并到someVar

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

  • 如果您致电someVar[0]();,则会输出0
  • 如果您致电someVar[1]();,则会输出1
  • 如果您致电someVar[2]();,则会输出2

在这里,您可以看到数组和someVar[0]的关闭,其中j = 0位于Chrome控制台中:

enter image description here