具有函数的Javascript闭包如何工作?

时间:2017-04-17 07:51:56

标签: javascript function closures lexical-closures

您好我一直在探索闭包和javascript核心概念我无法理解为什么console.log(factory [i])输出undefined我已经把我的函数推到了那里?如果我在循环之外调用temp它表示未定义,而如果我在循环内调用它返回有点困惑任何人都可以解释我吗?这是我的代码

var fruits=["apple","orange"];
var factory=[];
for(var i=0;i<fruits.length;i++)
{
   var temp=function()
   {
      console.log(fruits[i]);
   }
  factory.push(temp());
}
temp();
console.log(factory);
for(var i=0;i<factory.length;i++)
{
   temp(i);
   console.log(factory[i]);
}

https://jsfiddle.net/kh3okLca/

3 个答案:

答案 0 :(得分:1)

  1. 你没有传递函数,而是执行函数temp()的结果,因为它不会返回任何未定义的函数。 change factory.push(temp()); to factory.push(temp);

  2. temp()外部返回未定义,因为在那个时间循环已执行且i的值为2时,请检查以下记录i值的代码。

  3. &#13;
    &#13;
    var fruits=["apple","orange"];
    var factory=[];
    for(var i=0;i<fruits.length;i++)
    {
    	var temp=function()
      {
      	console.log(fruits[i],"console",i);
      }
      factory.push(temp);
    }
    temp();
    console.log(factory,"factory");
    for(var i=0;i<factory.length;i++)
    {
     	temp(i); //i resets to 0 here in same scope
        console.log(factory[i](i),"factoryi"); //this doesnt return anything so its undefined but statements are executed
    }
    &#13;
    &#13;
    &#13;

答案 1 :(得分:0)

这是你的输出。

    //next two executed due to factory.push(temp()) in first if loop 
    & there is a console.log there inside the function
    apple   
    orange
    //here i++ in first loop will be 3, but array have only two element, so it is undefined
    undefined
    // due to console.log(factory)
     // temp function is actually returning undefined,
    [undefined, undefined]
    // due to temp(i) in second if block
    apple
    // but factory array is stil empty so factory[i] will be undefined
    undefined
    from temp  orange
    undefined

答案 2 :(得分:0)

关闭只是保存数据的功能。直到现在一个函数被视为代码的和平,它接受输入并产生一些输出,对于每个函数调用,这个代码保持不变,但是闭包使你有机会用可以改变的函数保存一些数据,这样每个函数调用它会有不同的反应,记住一切都会很容易。

假设你有一个找到兴趣点的功能,但这个功能由三个利率不同的团队使用。所以一般我们做的是我们通过团队名称和原则数量,每次我们必须传递团队名称,所以通过使用闭包,我们可以为每个团队提供一个函数的三个实例(团队名称作为保留数据),现在只发送原则数量并根据团队获得计算的利息,我稍后我会添加例如,