2014-03-19 70 views
5

此代碼new Function('fn', 'fn()')創建具有參數和(在這種情況下,param是一個函數)執行的匿名函數。Javascript的函數構造函數 - 範圍問題?

console.log(new Function('fn', 'fn()'))顯示輸出:

function anonymous(fn) 
{ 
    fn() 
} 

現在,文檔指出:

注:FunctionsFunction 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,但是怎麼回事?它假設在全球運行,並且只能訪問本地和全球!

我缺少什麼?

+1

您將'f'傳遞給函數並執行'f'。 **'f'可以訪問'myFunc'的作用域** ...如果你的代碼是'new Function(「」,「alert(a);」)();我不認爲這會起作用。因爲'a'不能被新函數訪問 – Ian

+0

@Ian是 - 如果我直接寫了'alert',它就無法工作。 ,但是就我而言,參數確實創建了一個閉包....他們應該清楚,在文檔中可以通過函數 –

+0

訪問閉包參數。但是您剛剛提到的與「新函數」構造函數無關。請記住,你可以傳遞一個函數並在任何地方執行它 - 它可以訪問它自己的父範圍。 'new Function'也不例外。就像我說的那樣,文檔正在討論「新函數」的作用域,而不是傳遞給該函數的任何閉包。因爲即使在你的例子中,你正在質疑,正如我用'alert(a)'指出的那樣,新函數不能訪問'myFunc'的作用域。你不是在質疑正確的範圍 – Ian

回答

2

因爲你正在調用函數f,這是一個正常的函數,它創建了一個閉包。

的文件指的是這樣的:

var a = 44; 

function myFunc() 
{ 
    var a = 1; 

    new Function('fn', 'alert(a)')(); //shows 44, not 1 
} 
myFunc(); 
1

在你的榜樣,你叫這裏面myFunc的函數定義˚F功能。無所謂你從哪裏來。所以,你叫你在全球範圍定義見匿名功能稱爲˚F功能= 44,匿名函數是在myFunc的範圍定義見A = 1

我不知道究竟你想達到這個代碼是什麼,但如果你需要在˚F你需要在那裏把它作爲一個參數。

var a = 44; 

function myFunc() { 
    var a = 1; 

    function f(myArgument) { 
     alert(myArgument) 
    } 
    new Function('fn', 'fn(a)')(f); 
} 
myFunc();