JS 新函数 - 按名称动态记录变量

JS new Function - logging a variable by name dynamically

我们在 运行 时间内获得了代码片段以及代码中使用的变量名称。我们想要评估给定的代码并记录变量的值。

示例:

假设我们的代码是 var foo = "Blah"; 并且变量的名称是 foo.

eval('var foo = "Blah"; let varName = "foo"; console.log(this[varName]);');

产量 Blah.

new Function('var foo = "Blah"; let varName = "foo"; console.log(this[varName]);')();

产量 undefined.

有没有办法让它与新函数一起工作?

使用 new Function,您正在创建一个新函数。执行的代码类似于:

function someFunction() {
  var foo = "Blah"; let varName = "foo"; console.log(this); console.log(this[varName]);
}
someFunction();

那里,foosomeFunction 的本地范围内。它不是全局的,因此在函数内用 var 声明的变量不会被放入全局对象中。

相比之下,eval 在顶层运行。您执行的 eval 代码类似于:

var foo = "Blah"; let varName = "foo"; console.log(this[varName]);

都在顶层,所以声明的 foo 变量被放到全局对象上,this.

直接将变量名代入函数定义,而不是使用this

let varName = 'foo';
new Function(`var ${varName} = "Blah"; console.log(${varName});`)();

这里的一切都是关于范围的。全局作用域和块作用域。

全局范围

全局声明的变量(在任何函数之外)具有全局作用域。

var bikeName = "Honda";

// code here can use bikeName

function myFunction() {
  // code here can also use bikeName
}

    var greeter = "hey hi";
    
    function newFunction() {
        var hello = "hello"; //Variables declared Locally (inside a function) have Function Scope.
    }

    console.log(hello); // error: hello is not defined

在这里,greeter 是全局范围的,因为它存在于函数之外,而 hello 是函数范围的。所以我们不能在函数外访问变量 hello。

块范围

块是由 {} 界定的一大块代码。一个块住在大括号中。

   let times = 4;

   if (times > 3) {
        let hello = "say Hello instead";
        console.log(hello);// "say Hello instead"
    }
   console.log(hello) // hello is not defined

你应该阅读它们。事情会清楚的

因此在你的情况下:

new Function('var foo = "Blah"; let varName = "foo"; console.log(this[varName]);')();

函数内的所有内容都具有函数作用域,并且不会在全局范围内可用!