如何解决JS新功能-通过名称动态记录变量
我们在运行时提供了一个代码段以及在代码中使用的变量的名称。我们要评估给定的代码并记录变量的值。
示例:
假设我们的代码是var foo = "Blah";
,而var的名称是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]);')();
函数内部的所有内容都有函数作用域,将无法全局使用!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。