2017-01-05 76 views
-1

我已經知道關閉的關鍵是關於作用域。但我不知道它的具體執行順序。這JS關閉的語句執行順序是什麼?

關於閉包的「Professional JavaScript for Web Developers 3rd Edition」的經典代碼。

function createFunctions(){ 
 
\t var result=new Array(); 
 
\t alert('haha'); 
 
\t for(var i=0;i<10;i++){ 
 
\t \t result[i]=function(){ 
 
\t \t \t alert(i); 
 
\t \t \t return i; 
 
\t \t }; 
 
\t } 
 
\t return result; 
 
} 
 
var a=createFunctions();

令我驚訝的是,「哈哈」被驚動,而沒有「我」是alerted.I只是將功能分配到變量a.Why聲明「警報(‘哈哈’ )「在循環未執行時被警告?

當我添加下面的代碼,

var a=createFunctions(); 
 
    alert(a[2]);

why it alerted like this 

function(){ 
 
    \t \t \t return i; 
 
    \t \t }

不喜歡

function(){ 
 
     \t \t return 2; 
 
     \t \t }

而且當我添加下面的代碼,會是怎樣執行特別是在循環語句語句的順序。

var a=createFunctions(); 
 
     alert(a[2]());

+0

爲什麼要提醒我呢?你永遠不會調用這些函數。此外,陣列中的所有功能在運行時都會提醒您10 ... – Teemu

+0

這本書很古老。我建議你找到一個更新的。 –

回答

1

當調用

var a=createFunctions() 

警報(「哈哈」)被立即執行,並且創建和分配給該變量「a」,每個函數ALERTING「i」和返回它的10種功能的陣列。

但是,在調用這些函數的任何的任何(只要在創建它們之後調用它們),i的值爲'10'(循環終止值)。所以每次調用的函數一次,與

alert(a[x]()) 

(帶通9 x = 0的任何值) 它會提醒(10)的函數執行和警報(10)時再返回。

+0

爲什麼創建的十個函數返回我不是0〜9? – zyMacro

0

爲什麼聲明 「警報( '哈哈')」 被驚動

因爲它是在你調用該函數的警告聲明。

而週期以前並不執行

執行的週期。循環只是創建一些函數並將它們分配到數組中的位置。你永遠不會調用任何這些功能。

,當我添加下面的代碼,會是什麼語句的順序執行

這取決於你在哪裏添加。