2014-03-19 57 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();