簡體   English   中英

在節點js中使用閉包

[英]Using closures in node js

使用以下方法有什么區別?

第一種方法:

for(var i = 0; i < 10; i++) {
    (function(e){
        setTimeout(function() {
            console.log(e); 
        }, 1000);
    })(i);
}

for(var i = 0; i < 10; i++) {
    createTimeoutFunction(i);
}

第二種方法:

function createTimeoutFunction(e){ 
    setTimeout(function() {
        console.log(e); 
    }, 1000);
}

for(var i = 0; i < 10; i++) {
    createTimeoutFunction(i);
}

我是Node js和使用閉包的新手。 盡管這兩種方法都返回相同的輸出,但是第二種方法卻運行錯誤。 我不明白為什么我們需要像第一種方法那樣使用兩個循環。 我們不能像第二種方法那樣執行嗎?

在第一個方法中刪除第二個for ,因為除非您希望循環運行兩次,否則這是多余的,因為第一個方法中已經發生了所有事情。 第二個循環失敗,因為與第二個方法相反, createTimeoutFunction從未在第一個循環的范圍之外定義。

除此之外,它們都將產生相同的結果,唯一的區別是第二種方法createTimeoutFunction是可重用的。

另請參閱: JavaScript閉包如何工作?

不論您使用的環境或解釋器如何,javascript中的閉包都可以正常工作。

閉包提供了在其中執行該組代碼的特定變量范圍。 您的閉包將(顯然)可以訪問其內部定義的任何內容以及任何在封閉的閉包中定義的對象。

編寫代碼的問題在於,在第一個示例中, createTimeoutFunction沒有在任何地方定義-調用它時將失敗。 在該示例中:

(function(e){
    setTimeout(function() {
        console.log(e); 
    }, 1000);
})(i);

在此閉包中定義的函數是匿名函數。 它沒有name屬性,不能被引用。

第二個版本定義了一個全局變量createTimeoutFunction ,由於它是全局對象的一部分,因此可以在頁面上的任何閉包中進行訪問。 (好吧,我假設這是因為您沒有在顯示此代碼被任何其他內容括起來)。

暫無
暫無

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

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