此代碼new Function('fn', 'fn()')
創建具有參數和(在這種情況下,param是一個函數)執行的匿名函數。Javascript的函數構造函數 - 範圍問題?
做console.log(new Function('fn', 'fn()'))
顯示輸出:
function anonymous(fn)
{
fn()
}
現在,文檔指出:
注:
Functions
與Function constructor
創建辦不創建 關閉他們的創作環境;它們始終是在 全球範圍中創建的。在運行它們時,它們只能訪問 自己的,而不是其中函數構造函數被調用的範圍 。這與 不同,它使用eval和函數表達式的代碼。
好的。
那麼,爲什麼this code產量1
而不是44
?
var a = 44;
function myFunc()
{
var a = 1;
function f()
{
alert(a)
}
new Function('fn', 'fn()')(f);
}
myFunc();
爲什麼?
這條線上面怎麼樣?
他們將只能從該函數的構造 被稱爲
它看起來像f
範圍訪問他們自己的局部變量和全局 的,不是那些是關閉了父母a
,但是怎麼回事?它假設在全球運行,並且只能訪問本地和全球!
我缺少什麼?
您將'f'傳遞給函數並執行'f'。 **'f'可以訪問'myFunc'的作用域** ...如果你的代碼是'new Function(「」,「alert(a);」)();我不認爲這會起作用。因爲'a'不能被新函數訪問 – Ian
@Ian是 - 如果我直接寫了'alert',它就無法工作。 ,但是就我而言,參數確實創建了一個閉包....他們應該清楚,在文檔中可以通過函數 –
訪問閉包參數。但是您剛剛提到的與「新函數」構造函數無關。請記住,你可以傳遞一個函數並在任何地方執行它 - 它可以訪問它自己的父範圍。 'new Function'也不例外。就像我說的那樣,文檔正在討論「新函數」的作用域,而不是傳遞給該函數的任何閉包。因爲即使在你的例子中,你正在質疑,正如我用'alert(a)'指出的那樣,新函數不能訪問'myFunc'的作用域。你不是在質疑正確的範圍 – Ian