2011-11-23 126 views
4

好吧,據我瞭解我的代碼,我創建了一個promoSlides對象,我是一個名爲init的私有函數,並返回一個js閉包(我不太熟悉),我返回了init,因此我可以在全局外使用它的。當我運行該文件時,我得到的promoSlides是未定義的,說錯誤控制檯的FF。我不確定我出錯的地方。我對此很陌生,所以可能有些錯誤。哦,幻燈片被定義在我的原始文檔中,但我爲了簡單起見而將其取出爲什麼我的JS應該返回一個對象返回undefined?

var Slider = (function (name) {return name;}(Slider || {})); 

Slider.promoSlides = (function() 
{ 
var slides; 

var init = function(s) 
{ 
    slides = s; 
    sortSlides(); 
    startTimer(); 
    addListeners(); 
}; 
return 
{ 
    init : function a(s) 
    { 
     init(s); 
    } 
}; 

})(); 

$(document).ready(function(){ 
    Slider.promoSlides.init(slides); 
}); 
+1

「我定義的私有函數[...]所以我可以用它在全球範圍之外的一種」:「全球範圍內使用」和「私人函數「通常是相互排斥的概念;) –

+0

查看http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding對分號插入規則的好評以及JavaScript中的換行禮儀。 –

回答

4

分號再次插入!

return 
{ 
    init : function a(s) 
    { 
     init(s); 
    } 
}; 

必須

return { 
    init : function a(s) 
    { 
     init(s); 
    } 
}; 

這是在JavaScript中的「功能」,着眼於只return它你行的結果,並說:「哦,你忘了分號,我會爲你添加它。「

它將return更改爲return;,因此您的函數現在返回undefined,然後在它下面有一些裸JSON,這是您的錯誤的來源。 Douglas Crockford實際上將其描述爲JavaScript的「糟糕的部分」之一。

因此,故事的寓意是:總是當您在JavaScript中編碼時,將您的左大括號放在同一行上。

+0

擊敗我3秒! – nrabinowitz

+0

@nrabinowitz - 如果我每次都有一美元發生在我身上:) –

+0

哦哇,修復這個問題,謝謝。我不知道 – Huangism

4

你的問題是致命的 「假定分號」 在回行:

return //; <-- Javascript puts an implicit EOL here 
{ 
    init : function a(s) 
    { 
     init(s); 
    } 
}; 

更改爲

return { 
    init : function a(s) 
    { 
     init(s); 
    } 
}; 

和你的代碼應該運行。

+0

是的,它的工作表示感謝,另一個擊敗你,所以我選擇他作爲正確的答案 – Huangism

0

上面已經描述了「假設的分號」問題。但不要使用那麼多的函數調用!

var init = function() { ... }; 
return { 
    init : init 
}; 

作品一樣好,甚至更短:

var slides; // unused variable ??? 
return { 
    init: function init(s) { 
     slides = s; 
     sortSlides(); 
     startTimer(); 
     addListeners(); 
    } 
}