为什么内联实例创建行为不同?

时间:2012-03-20 06:50:03

标签: javascript

考虑以下代码:

function Foo() {
}

Foo.prototype.alert = function() {
    alert(this);
}

(new Foo()).alert();

执行时(在jsfiddle中),警报显示'this'是窗口对象。将最后一行更改为:

var foo = new Foo();
foo.alert();

按预期工作。

为什么会有区别?

2 个答案:

答案 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运算符具有最高优先级,因此不需要括号。