2012-03-20 49 views
7

考慮以下代碼:爲什麼內聯實例創建行爲不同?

function Foo() { 
} 

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

(new Foo()).alert(); 

當被執行時(在的jsfiddle),警報顯示,「這個」是窗口對象。將最後一行更改爲:

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

按預期工作。爲什麼不同?

+0

jsFiddle演示。看起來第二個'alert'沒有得到執行:http://jsfiddle.net/sf3M3/ – 2012-03-20 06:56:59

回答

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運算符的優先級最高,因此不需要括號。

6

你的代碼實際上是:

function Foo() { 
} 

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

由於缺少分號,加上分號,它會正常運行。

+0

+1擊敗我。這是不依賴於[自動分號插入](http://es5.github.com/#x7.9)的恐怖的**許多**原因之一。 – 2012-03-20 07:00:27

相關問題