2012-04-26 97 views
3

調用帶有或沒有新關鍵字的JavaScript函數有區別嗎?舉例來說,如果我有以下功能:Javascript新的關鍵字使用

function computer(){ 
    this.hardDrive = "big"; 
    this.processor = "fast"; 
} 

,然後我把它以兩種不同的方式:

var hp = computer(); 
var hp = new computer(); 

是怎麼回事是這兩個函數調用之間的區別?

+1

重複的[JavaScript中'new'關鍵字是什麼?](http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript)和[JavaScript的新關鍵字認爲有害?](http://stackoverflow.com/questions/383402/is-javascript-s-new-keyword-considered-harmful)和[使用Object.create而不是新的](http://stackoverflow.com/問題/ 2709612/using-object-create-instead-of-new) – Phrogz 2012-04-26 01:26:27

+0

另請參見[在JavaScript中使用{}或new Object()創建空對象?](http://stackoverflow.com/questions/251402/create -an-空物體在JavaScript的與 - 或新對象)。 – Phrogz 2012-04-26 02:32:46

回答

8

沒有newthis引用全局對象,而不是從函數返回的任何對象。

如果您要執行您的代碼,您會發現第一個hp將是undefined,而第二個將是[object Object]。此外,由於顯而易見的原因,第一個將沒有hardDriveprocessor的財產,但第二個會。

在第一個示例中,您的兩個屬性將被添加到window對象。

+1

不是說第一種情況下的'this'(不是'new')是'window'全局對象嗎?並執行該函數將'hardDrive'和'processor'添加到全局對象? – Joseph 2012-04-26 01:27:24

+1

完全沒有。 ECMA-262定義了[執行上下文](http://es5.github.com/#x10.3),它是唯一使用該詞的上下文。執行上下文由所有局部變量,參數,作用域鏈等組成,幷包含* this *。 * this *通過調用設置的值與調用的執行上下文或通過調用創建的函數上下文完全沒有關係。所有你知道的是,在全局代碼中,* this *引用全局對象。在任何其他情況下,它可以引用(幾乎)任何東西,包括全局對象。 – RobG 2012-04-26 07:09:44

1

第一個,不使用new,將與this參照窗口對象運行。第二個使用new將創建一個新的空對象,該對象將是該函數內的this