2011-11-23 81 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(); 
    } 
}