2012-11-26 124 views
1
>>> function() {} 
SyntaxError 

>>> f = function() {} 
f = function() {} 

>>> new function() {} 
>>> Object 

>>> new Function() 
function anonymous() {} 

>>> Function() 
function anonymous() {} 


>>> f = (function() { a = 10; return function() {console.log(a);} })(); 
>>> f() 
10 
undefined 

>>> f = (function() { a = 10; return new Function('console.log(a)'); })(); 
>>> f() 
undefined 

因此,我有兩個問題:JavaScript的內幕101:功能和功能

  1. 爲什麼Function構造函數返回一個新的功能,即使沒有new操作?

  2. Function構造函數創建的函數是否關閉?

+0

2,是的,它不是一個閉包,因爲函數定義字符串是在孤立的上下文中求值的。 –

回答

7

爲什麼函數構造函數返回一個新函數,即使沒有新的操作符?

Calling Function() is the same as calling new Function()

Function被稱爲函數,而不是作爲一個構造函數,它創建和初始化一個新的函數對象。因此函數調用Function(…)等價於具有相同參數的對象創建表達式new Function(…)


與功能構造不倒閉創建的功能呢?

是的,函數的範圍設置爲全局環境,而不是詞法環境的範圍。見http://es5.github.com/#x15.3.2.1,步驟11:

11.返回如在13.2傳遞P作爲FormalParameterList作爲函數體指定創建了一個新的功能的對象。作爲範圍參數和嚴格作爲嚴格標誌通過全球環境。

這意味着使用Function構造函數,如果你宣佈全球範圍內的功能,就可以訪問範圍(對於未在功能可見)。

這是使用函數聲明/表達式,其中該範圍是基於所述當前exectution上下文(http://es5.github.com/#x13)不同:

  1. funcEnv是主叫NewDeclarativeEnvironment使運行的執行的結果上下文的詞法環境作爲參數
0

1,函數可以返回對象,所以Function()返回1是不荒謬的。如果你想使用它,我會仔細檢查文檔,因爲它不足以應付所有的瀏覽器。

2,正確。

+0

在當前詞彙範圍內評估'eval'。試試'(function(){var a ='foo'; eval('alert(a);');}())'。所以它實際上不像'eval'。 –

+0

是的,你說得對。回答編輯糾正。 – Douglas

1

Function是對象用於實現function s,它們在語義上是相同的基礎對象。

但是,function與它們所屬的腳本同時被解析,而Function正文在實例化時被解析,這可能解釋了爲什麼您會從js解釋器中獲得行爲差異。

查看​​瞭解更多信息。