2013-09-22 92 views
0

我是JavaScript編程新手。我編寫了一個IIFE,它可以幫助我提高理解度。我的意圖是定義一個$函數,當被調用時將自己調用爲構造函數。當代碼運行時,它會產生一個錯誤'太多的遞歸'。我不知道問題是什麼。IIFE引發錯誤

(function() { 
//check the global host object 
var root = this; 

var inside = "inside"; 

var $ = function() { 
    return new $(); //this line generates an error 'Too much recursion.' 
} 

$.check = function(obj) { 
    console.log(inside); 
} 

//add the $ to global object 
root.$ = $; 
}).call(this); 

var ins = $(); 

console.log(ins); 
+4

爲什麼你感到驚訝嗎?你期待什麼結果? –

+0

'if(!(this instanceof $))return new $();'? – Ryan

回答

1
var $ = function() { 
    return new $(); //this line generates an error 'Too much recursion.' 
} 

此功能反覆調用自身,這就是爲什麼您會看到Too much recursion.錯誤。您不區分常規功能呼叫和new呼叫。

我的意圖是定義一個$函數,當被調用時將自己調用爲構造函數。

最簡單的方法是明確檢查:

var $ = function $() { 
    if(!(this instanceof $)) return new $(); 
    // ... from this point on, behave as if called via new 
} 
1

這一行產生一個錯誤太多的遞歸。「

沒錯。您有一個分配給$符號的功能,它調用分配給$符號的功能。因此,每個呼叫(無論是直接呼叫還是通過new)都將運行該功能中的代碼,這會使調用另一個,依此類推,直到您超出引擎的遞歸意願。爲了避免這種情況,有$做別的。

0

這是因爲你創建了一個無限循環。通過在返回新的var實例時使用括號,您可以遞歸地調用沒有參數的函數。我不確定你想完成什麼,但是你可能想要$創建一個新的對象「{}」,然後你可以擴展那個引用的方法。看看單身模式,這將允許你創建一個新的實例的東西。編輯,只是爲了清楚你的問題與IIFE沒有任何關係,你可能會遇到同樣的錯誤,無論你試圖以這種方式調用一個新的函數。