2016-08-26 39 views
0

我將一個函數作爲參數傳遞給一個IIFE中的構造函數。我意識到一個IIFE的外部函數將被執行,但它似乎也執行了函數參數。我不明白爲什麼,想知道如何解決這個問題。這裏有兩個例子:JavaScript中的IIFE是遞歸的嗎?

var Foo = function(bar) { 
    this.bar = bar; 
}; 
new Foo(function() { console.log("test"); }); 

在上面的例子中,事情工作正如我所料。匿名函數作爲參數傳遞給Foo構造函數,但未運行。

這裏是另外一個例子,它看起來是一個IIFE內創建執行一個匿名函數,即使它沒有明確提出:

(function() { 
    var Foo = function(bar) { 
     this.bar = bar; 
    }; 
    Foo.STATIC_FIELD = new Foo(new function() { console.log("test"); }); 
    return Foo; 
})(); 

在第二個例子中,「測試」被寫入安慰。我正在使用IIFE來保護全球名稱空間免受Foo污染。但是,我不希望傳遞給Foo構造函數的函數立即執行。這是我保留的函數,以便稍後可以使用Foo.STATIC_FIELD.bar();來調用它。達到此目的的最佳方式是什麼?

+4

您在第二個示例中使用'new'調用匿名函數。刪除'新',你會成爲金。 –

+1

我將此標記爲錯字,因爲我認爲它是一個。否則,這是一個寫得很好的問題。 – DavidS

+0

其實我也打算在第一個例子中使用新的。但你是對的。我想我的直覺是我必須用新來創造一些東西。但是在這種情況下,你不用new創建一個函數,你使用new運行一個函數。有點奇怪「新myFunction」與「myFunction()」有什麼相同之處。 –

回答

-2

我的問題在Mike C和DavidS的評論中得到了充分的回答。如果你想存儲一個函數供以後調用,不要使用「new」,因爲它會運行該函數。之後,一定要在該函數上調用「調用」,並使用保持該函數的對象的上下文。例如:

foo.myFunction.call(foo); 
+0

你知道,只要做'foo.myFunction()'就可以工作。 –

+0

如果你使用'new'並且不能在函數後面添加'()',解釋器會添加'()' – passion