这会执行以产生正确的结果,并且 Chrome 调试器说没有异常:
var x = new Foo().bar().baz();
但这会进入空间并且永远不会完成,Chrome 调试器说虽然 bar() 正确执行,但它会抛出“typeerror”异常,并且在尝试调用 baz() 时永远不会到达指定的函数:
var x = new Foo();
x = x.bar().baz();
在我看来,它们在功能上是相同的。为什么他们的行为不同?
这会执行以产生正确的结果,并且 Chrome 调试器说没有异常:
var x = new Foo().bar().baz();
但这会进入空间并且永远不会完成,Chrome 调试器说虽然 bar() 正确执行,但它会抛出“typeerror”异常,并且在尝试调用 baz() 时永远不会到达指定的函数:
var x = new Foo();
x = x.bar().baz();
在我看来,它们在功能上是相同的。为什么他们的行为不同?
似乎与 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
两组代码在功能上是相同的。
你需要括号:
var x = (new Foo()).bar().baz();
否则,该new
语句将应用于 的返回值Foo().bar().baz()
,所有这些都将在尝试实例化之前执行。
更新:正如他们所说,我注意到这是错误的。但我认为评论很有趣,所以我不会删除答案。
回答了我自己的问题——男孩,我觉得自己笨!对不起。对“为什么他们的行为不同?”的简短回答 - 他们没有。
出于让其他人尝试相同的事情但得到不同的结果的动机,我进一步思考了我的问题,最终发现……一个错字!我建模为“baz()”的函数的原始名称是驼峰式的冗长字符串,并且错误大小写的 ell ('l') 悄悄进入。
事实证明,调试器是一条红鲱鱼。(我只用它们来跟踪执行和显示错误消息,而不是评估任何东西或模拟环境。)
希望如果错误消息更直接,我会更快地发现真正的问题。Chrome 调试器报告了“类型错误”的抛出,而 Firebug 报告了“无效的范围变量”,这两者都没有提示我在函数名称中查找拼写错误。
经验教训:不要在午夜后发布问题:-)