2

我一直在研究 codeschool.com 的关于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
}));

我觉得它以前应该仍然有效......当少一个括号时发生了什么?

4

2 回答 2

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 }
于 2013-10-26T06:50:35.727 回答
1

以另一种方式回答,您需要使用 Backbone.Router 的实例,您可以先使用自己的路由器对其进行扩展。如:

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

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

您示例中的代码首先评估扩展调用,然后使用返回值创建一个实例。最终结果是相同的,但如果您不知道括号导致评估发生,可能会有点误导。

于 2013-10-26T11:07:13.437 回答