4

这会执行以产生正确的结果,并且 Chrome 调试器说没有异常:

var x = new Foo().bar().baz();

但这会进入空间并且永远不会完成,Chrome 调试器说虽然 bar() 正确执行,但它会抛出“typeerror”异常,并且在尝试调用 baz() 时永远不会到达指定的函数:

var x = new Foo();
x = x.bar().baz();

在我看来,它们在功能上是相同的。为什么他们的行为不同?

4

3 回答 3

5

似乎与 Chrome 调试器有关:

function Foo(){}

Foo.prototype.bar = function() {
  return this;
}

Foo.prototype.baz = function() {
  return 'baz';
}

var x = new Foo().bar().baz();
console.log(x); // baz

正如预期的那样(Firefox、IE、Chrome)。

编辑

并且:

var x = new Foo();
x = x.bar().baz()
console.log(x); // baz

两组代码在功能上是相同的。

于 2013-11-01T04:47:22.880 回答
2

你需要括号:

var x = (new Foo()).bar().baz();

否则,该new语句将应用于 的返回值Foo().bar().baz(),所有这些都将在尝试实例化之前执行。

更新:正如他们所说,我注意到这是错误的。但我认为评论很有趣,所以我不会删除答案。

于 2013-11-01T04:45:22.453 回答
0

回答了我自己的问题——男孩,我觉得自己笨!对不起。对“为什么他们的行为不同?”的简短回答 - 他们没有

出于让其他人尝试相同的事情但得到不同的结果的动机,我进一步思考了我的问题,最终发现……一个错字!我建模为“baz()”的函数的原始名称是驼峰式的冗长字符串,并且错误大小写的 ell ('l') 悄悄进入。

事实证明,调试器是一条红鲱鱼。(我只用它们来跟踪执行和显示错误消息,而不是评估任何东西或模拟环境。)

希望如果错误消息更直接,我会更快地发现真正的问题。Chrome 调试器报告了“类型错误”的抛出,而 Firebug 报告了“无效的范围变量”,这两者都没有提示我在函数名称中查找拼写错误。

经验教训:不要在午夜后发布问题:-)

于 2013-11-01T18:51:20.590 回答