2013-10-26 34 views
2

我已經通過codeschool.com的教程Backbone.js的 並提交了工作:backbone.js - 「新」關鍵字後需要括號嗎?

var AppRouter = new Backbone.Router.extend({ 
    //code 
}); 
$(function(){ AppRouter.start() }); 

,它給了以下錯誤消息:

TypeError: 'undefined' is not a function (evaluating 'AppRouter.start()') :28 :14 

但增加一個括號解決了這個問題

var AppRouter = new (Backbone.Router.extend({ 
    //code 
})); 

我覺得它應該仍然有效...之前發生了什麼當有一個少括號?

回答

3

它使用Backbone.Router.extend作爲構造函數(括號作爲構造函數的參數,而不是Backbone.Router.extend調用的結果(其中調用Backbone.Router.extend返回要用作構造函數的函數)例如,比較:

function Test() 
{ return function() { this.a = 2; }; 
} 

console.log(new Test()); // function() { this.a = 2; } 
console.log(new (Test())); // { a: 2 } 
1

回答另一種方式,你需要用Backbone.Router,你可以先用自己的路由器擴展的實例來工作。如:

var AppRouter = Backbone.Router.extend({ 
    routes: { 
     // code 
    } 
}); 

var router = new AppRouter(); 
Backbone.history.start(); 

在您的示例代碼是eval首先使用擴展調用,然後使用返回值創建一個實例。最終結果是相同的,但如果您不知道括號導致評估發生,可能會有點誤導。