2015-09-04 52 views
1

標題說明了一切。在JavaScript中使用new運算符聲明函數有什麼好處?

我正在讀一本書,並在功能的章節中,作者提出的是有使用new運算符聲明功能的優點。

但後來我看到了類似的聲明

function myFunction(){ 
} 

經常的應用,只是聲明瞭像,

var myFunction = new Function(); 

有什麼建議?

+0

我認爲這是這個副本http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript –

+2

@MuhammadUsman - 不,這個問題是關於'new Function( ...)'創建一個新的函數對象,而不是創建一個新的常規對象的'New SomeConstructor()'。 – jfriend00

回答

3

MDN description of Function: 函數創建時與功能構造函數創建

函數對象進行解析。這比使用函數表達式或函數聲明聲明 函數的效率要低,並且在代碼中調用 ,因爲這些函數會與代碼的其餘 一起解析。

傳遞給該函數的所有參數均被視爲要創建的函數中參數的 標識符的名稱,其傳遞順序爲 。

注意:使用Function構造函數創建的函數不會創建 關閉其創建上下文;它們始終在全球範圍內創建。運行它們時,它們只能訪問 自己的局部變量和全局變量,而不能訪問調用Function構造函數的範圍 。這與 不同,它使用eval和函數表達式的代碼。

所以,從這個,您使用new Function(...)時看到以下區別:

  1. 新函數的代碼是一個字符串被解析時new Function(...)被調用,而不是當頁面解析。例如,你可以建立一個字符串,然後用它作爲你的函數體。

  2. 這些功能始終在全球範圍內創建和他們不被創建的環境中創建關閉。

  3. 這些功能不能訪問父作用域的變量。

  4. 您可以動態構建代碼,然後將其轉換爲解析/實時功能 - 有點類似於eval(),但有一些細微差別。


注:因爲函數體與new Function(...)結構必須被包含在一個JavaScript字符串,它的雜亂這樣寫的大多數代碼。 new Function(...)一般只適用於需要快速構建函數體的特殊情況(這可能是非常罕見的情況),而不是您提前知道代碼的位置。

+0

Upvoted,但在同一章節的底部,作者建議「使用new操作符聲明函數的優點是腳本可以在文檔加載後創建函數。」我想我沒有得到它。你能否詳細說明一下。 –

+1

@ShirgillAnsari - 這是我的觀點#1和#4以上。這是非常罕見的,當這是需要的。我見過的唯一情況是用戶提供的代碼被動態添加到頁面中。我知道沒有理由將此構造用於您自己的代碼。 – jfriend00

相關問題