此代码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