2017-10-07 31 views
0

为什么此代码片段输出5(如预期由于范围链)?JavaScript中'实体'对象和函数对象之间的生命周期有什么区别?

let arr = [] 
var firstFunc; 
for(var i = 0; i < 5; i++) { 
    var iterFunc = function() { 
     return function() { 
      return i 
     } 
    } 
    arr.push(iterFunc()) 
} 

console.log(arr[0]()) 

但这输出{A:0}:

let arr = [] 
var firstFunc; 
for(var i = 0; i < 5; i++) { 
    var iterFunc = function() { 
     return { 
      a: i 
     } 
    } 
    arr.push(iterFunc()) 
} 

console.log(arr[0]) 

引擎盖下发生什么存储器分配逻辑?为什么'实体'对象与闭包相反,保持当前值?

回答

0

返回i{a: i}这里没关系。

重要的是,在第一个例子中,iterFunc()返回一个函数,并在该函数中(尚未调用),其中i{a: i}被评估。

拥有i总是拥有一个标量(不可变)值,该值就是你所能得到的值。 (如果i本来就是一个对象,那么将返回该对象的引用,如果它的内容发生了变化,则可以看到该变化)。

作为不可变的值,您将获得该值。但是,如您所知,i值的时间变化,所以这里的关键是该值被读取。

如果你看到你的第一个例子,在console.log(...)声明,你是故意调用它,你知道它是(通过iterFunc()返回的匿名函数),以及当时的功能,i持有的5值。

,如果你在第一个例子中,你只需要改变下面一行:

arr.push(iterFunc()) 

通过

arr.push(iterFunc()()) 

...,当然:

console.log(arr[0]()) 

通过

console.log(arr[0]) // Same of your second example. 

您会意识到输出在两种情况下都是相同的(0)。

+1

真棒解释!它符合我的想法!谢谢! –

相关问题