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();
那里,foo
在 someFunction
的本地范围内。它不是全局的,因此在函数内用 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]);')();
函数内的所有内容都具有函数作用域,并且不会在全局范围内可用!
我们在 运行 时间内获得了代码片段以及代码中使用的变量名称。我们想要评估给定的代码并记录变量的值。
示例:
假设我们的代码是 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();
那里,foo
在 someFunction
的本地范围内。它不是全局的,因此在函数内用 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]);')();
函数内的所有内容都具有函数作用域,并且不会在全局范围内可用!