2015-09-20 31 views
3

以下2个代码片段有什么区别?通过示例了解javascript函数范围

我无法理解它们之间的任何差异。 两者都使用闭包(根据我的知识和纠正我,如果我错了) 并打印相同的输出是0,1,2,3,4。

for(var i = 0; i < 5; i++) { 

    (function(){ 
     var tmp = i; 
     setTimeout(function(){ 
      console.log(tmp); 
     }, 0) 
    })(); 

} 

for(var i = 0; i < 5; i++) { 

    setTimeout((function(tmp){ 
     return function() { 
      console.log(tmp); 
     } 
    })(i), 0); 

} 
+2

所以我认为它们是相同的。你为什么如此决心找出差异?如果他们工作一样,那么谁在乎呢? – Turtle

+1

结果无差异。在每种情况下,您只需制作一个不同类型的封盖。通常有很多不同的方法来实现给定的封闭。 – jfriend00

+2

@Turtle:这段代码片段在我的朋友面试时给了他,他们让他说出了区别。我对这段代码感到有些惊讶,所以如果我错过了某些东西,会得到证实。 – Parashuram

回答

0

如果您忘记了通过

var tmp = i; 

做了标识的分辨率和第一个片段改写为

for(var i = 0; i < 5; i++) { 

    (function(tmp){ 
     setTimeout(function(){ 
      console.log(tmp); 
     }, 0) 
    })(i); 

} 

那么IIFE这里创建范围和设置德放置执行,而第二个片段中的IIFE创建一个范围并返回一个具有该范围的函数。

+0

实际上这不是“差异”。或者是?对我来说那些是相同的。 – zerkms

+0

@zer呃,这与图像之间的区别有什么不同,也许它可能会归结为SoC。考虑执行上下文和范围始终是一个挑战。但是,如果我自己遇到任何片段,我不认为我会考虑,甚至不记得其他片段。而且这方面也有价值。 –

+0

面试中提出了这个问题。这意味着面试官希望听到一些*技术差异*,而不是“像在图像之间有什么区别” – zerkms