Javascript's函数构造函数-作用域问题

Javascript's Function constructor - scope issues?

本文关键字:构造函数 作用域 问题 函数 Javascript      更新时间:2023-09-26

这段代码new Function('fn', 'fn()')创建了一个匿名函数,该函数执行了param和(在本例中,param是一个函数)。

执行console.log(new Function('fn', 'fn()'))显示输出:

function anonymous(fn)
 {
  fn()
} 

现在,文档声明:

注:FunctionsFunction constructor创建do not create闭包到它们的创建上下文;类中创建的全球范围。当运行它们时,它们将只能访问它们自己的local variables and global ones而不是来自作用域其中调用了Function构造函数。这和在函数表达式代码中使用eval

那么为什么这段代码产生1而不是44呢?

var a = 44;
function myFunc()
{
    var a = 1;
    function f()
    {
        alert(a)
    }
    new Function('fn', 'fn()')(f);
}
myFunc();

为什么?

上面这行呢?

只能访问自己的局部变量和全局变量而不是Function构造函数所在的作用域被称为

看起来f是父a的闭包,但为什么呢?它应该在全局运行,并且只能访问本地和全局!

我错过了什么?

因为您正在调用函数f,这是一个创建闭包的普通函数。

文档中提到:

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

在您的示例中,您调用f函数,该函数在myFunc函数中定义。不管你是从哪里打的。所以你调用了在全局作用域中定义的匿名函数,见a = 44,匿名函数名为f函数,定义在myFunc作用域,见a = 1

我不确定你到底想用这段代码实现什么,但是如果你需要44在你的f中,你需要把它作为参数传递给它。

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