簡體   English   中英

javascript奇怪的行為需要解釋

[英]javascript strange behavior needed explanation

for(i=0; i< 3; i++){
    (function(i){
        console.log(i)
    })(i);
}

我已經遇到了這個問題,並且想知道它是如何工作的(我理解結果,只想對(function(i){})(i)以及它的名字有更深入的解釋。非常感謝!!!

(function(i){
    console.log(i)
})(i);

這就是所謂的自執行匿名函數,也就是您不必命名的函數。 定義后也立即執行。 如果查看第一組括號,它們將包裹function關鍵字,參數列表和函數定義,而第二組括號是您傳遞參數的位置。

/* self-executing anonymous function definition */
(   function(i){
        console.log(i)
    }    
)

/* pass argument i into the anonymous function and execute */
(i);

我用空格將其拆分開了一些,以便在視覺上更容易分解。

現在,由於函數參數和自變量具有相同的名稱,因此對於第一次看到此名稱的人來說,此定義可能會造成混淆。 所以這是相同的示例,除了我們只是將實際值傳遞給函數:

(function(i){
    console.log(i) // prints '5'
})(5);

代碼部分:

(function(i){
    console.log(i)
})(i);

是所謂的IIFE(立即調用函數表達式)。

這里重要的一點是,在JavaScript中,函數是一流的對象。 要詳細說明這一點,我還可以執行以下操作:

var log = function(i) {
   console.log(i);
}

for(var i=0; i<3; i++){
   log(i);
}

在此示例中,我將函數存儲為變量,然后使用函數調用運算符()對其進行了調用

回到原始示例,匿名函數周圍的括號實際上包含了我存儲在log變量中的內容。 然后,尾括號會調用在括號內創建的匿名函數。

(function(i){})(i)

這是一個自執行功能 這些將自動內聯求值以返回值。 它是值得理解的Java的一個不錯的功能。 您可以通過這種方式使用它們,但是它們對於創建范圍和擴展代碼的Javascript模塊非常有用。

對於循環的每次迭代,您都會創建並立即調用匿名函數,無論該特定迭代時i的值是多少。

請不要在不傳遞任何參數的情況下這樣做會起作用,因為調用函數時i仍處於上下文中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM