2015-09-20 63 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