考虑以下代码:
function Foo() {
}
Foo.prototype.alert = function() {
alert(this);
}
(new Foo()).alert();
执行时(在jsfiddle中),警报显示'this'是窗口对象。将最后一行更改为:
var foo = new Foo();
foo.alert();
按预期工作。
为什么会有区别?
答案 0 :(得分:6)
您的代码实际上是:
function Foo() {
}
Foo.prototype.alert = function() {
alert(this);
}(new Foo()).alert();
由于缺少分号,请添加分号,它将正常运行。
答案 1 :(得分:4)
您似乎错过了分号:
function Foo() {
}
Foo.prototype.alert = function() {
alert(this);
}; //Semi-colon here!
(new Foo()).alert();
这里有一个fiddle,它看起来像你期望的那样工作。
实际发生的是立即调用alert
方法,并在其中传入Foo
的新实例,然后在返回值上调用alert
(这是undefined
):
Foo.prototype.alert = function() {
alert(this);
}(new Foo()).alert();
正如@Nemoy所提到的,如果你只使用new Foo().alert()
,你会得到预期的行为,因为自动分号插入会在你的右边放一个分号(缺少分号)不会改变代码的含义)。由于new
运算符具有最高优先级,因此不需要括号。