考慮以下代碼:爲什麼內聯實例創建行爲不同?
function Foo() {
}
Foo.prototype.alert = function() {
alert(this);
}
(new Foo()).alert();
當被執行時(在的jsfiddle),警報顯示,「這個」是窗口對象。將最後一行更改爲:
var foo = new Foo();
foo.alert();
按預期工作。爲什麼不同?
考慮以下代碼:爲什麼內聯實例創建行爲不同?
function Foo() {
}
Foo.prototype.alert = function() {
alert(this);
}
(new Foo()).alert();
當被執行時(在的jsfiddle),警報顯示,「這個」是窗口對象。將最後一行更改爲:
var foo = new Foo();
foo.alert();
按預期工作。爲什麼不同?
看來你缺少一個分號:
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
運算符的優先級最高,因此不需要括號。
你的代碼實際上是:
function Foo() {
}
Foo.prototype.alert = function() {
alert(this);
}(new Foo()).alert();
由於缺少分號,加上分號,它會正常運行。
+1擊敗我。這是不依賴於[自動分號插入](http://es5.github.com/#x7.9)的恐怖的**許多**原因之一。 – 2012-03-20 07:00:27
jsFiddle演示。看起來第二個'alert'沒有得到執行:http://jsfiddle.net/sf3M3/ – 2012-03-20 06:56:59