2014-11-23 98 views
1

我們都知道,如果不帶'new'關鍵字調用JavaScript構造函數是不好的。 那麼,爲什麼這樣的:JavaScript - 函數構造函數不帶'new'關鍵字

Function("a", "b", "return a + b")(1, 1); // returns "2" 

返回相同的值,因爲這?:

new Function("a", "b", "return a + b")(1, 1); // Also returns "2" 

,並有在這種情況下省略了「新」的關鍵字任何傷害(或利益)?

+0

@ Qantas94Heavy它不是重複的,因爲在鏈接問題中沒有任何地方提到了'Function'構造函數。 – 2014-11-23 05:00:44

+0

@ Qantas94Heavy不,我沒有保持這個問題的既得利益。我可以立即解決這個問題。但是,我確實認爲這是一個真正的新問題,因爲它解決了相關問題沒有解決的問題。對於在StackOverflow上尋找答案的人而言,沒有什麼比煩惱不得不遵循重複的鏈接,然後發現他們必須爲自己推斷答案。重複只要是新的就可以了:http://blog.stackoverflow.com/2010/11/dr-strangedupe-or-how-i-learned-to-stop-worrying-and-love-duplication/ – 2014-11-23 05:16:34

回答

3

構造函數Function會創建一個新函數,無論您是否使用new來調用它。這就是它的寫法。如果需要,可以用這種方式編寫構造函數。

MDN page on the Function constructor

調用函數的構造作爲函數(不使用新 操作者)與調用它作爲構造相同的效果。

使用或不使用new運營商與Function構造函數沒有傷害或利益,甚至任何差異。

0

不,如果沒有new關鍵字,請致電Function確實沒有任何危害。事實上,我建議儘可能在您的程序中使用newstop using the new keyword

這將是最好創建一個new函數:

Function.prototype.new = function() { 
    Factory.prototype = this.prototype; 
    return new Factory(this, arguments); 
}; 

function Factory(constructor, args) { 
    return constructor.apply(this, args); 
} 

,現在你可以創建如下情況下它這樣做的好處是:

function Foo(a, b) { 
    this.a = a; 
    this.b = b; 
} 

var foo = Foo.new(1, 2); 

// instead of 

var foo = new Foo(1, 2); 

有什麼意義?問題的關鍵是,你現在可以做的事情一樣:

var foo = Foo.new.apply(Foo, [1, 2]); 

因爲new是一個功能,你可以做一些事情來它喜歡它應用到一個數組參數,等等。你不能做的同樣的事情new關鍵字。

無論如何,回到主題Function構造函數可以帶或不帶new關鍵字調用。它沒有任何區別。因此,我建議你不要使用關鍵字new。它不僅爲您節省幾個按鍵也可以用於諸如:

Function.apply(null, ["a", "b", "return a + b"]); 

,這是特別有用的,如果你不知道你要多少參數的函數事先有。

希望有所幫助。