javascript – eval black magic失去范围
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – eval black magic失去范围,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1620字,纯文字阅读大概需要3分钟。
内容图文
![javascript – eval black magic失去范围](/upload/InfoBanner/zyjiaocheng/751/80e63e8f73674a5da2ab80038176c814.jpg)
免责声明我不赞同使用eval,我在编写代码时不使用它.
我在一个遗留项目上分配逻辑,并且在eval中遇到了一些非常奇怪的行为,并且想知道为什么会出现这种行为的原因.
var baz = function(cb) {
cb('asdf');
}
function foo(qux, callback) {
setTimeout(function() {
// eval(callback('asdf')); // works
// eval(baz(callback)); // works
// eval(qux + "(" + callback + ")"); // resolve is undefined
});
}
function bar() {
return new Promise((resolve, reject) => {
try {
foo('baz', function(response){
resolve(response);
});
} catch (e) {
reject(e);
}
});
}
function init() {
bar()
.then(response => {
console.log(response)
})
.catch(e => console.log(e));
}
init();
我写了三个使用eval的不同方法的例子,在函数foo中注释掉了
第三个例子不起作用.这是我关心的例子,因为它是我们遗留代码的工作方式.我知道还有其他方法可以解决这个问题.我的解决方案是重写函数而不是使用eval.
我的问题非常准确,当你将函数名作为字符串传递时,为什么eval会失去作用域,但是当你传递对同一函数的实际引用时它不会失去作用域?
这是一个jsfiddle:
https://jsfiddle.net/tkcjay4x/6/
解决方法:
我不得不承认,标题让我有点害怕.如果我理解这个“黑魔法”,它会让我成为一个邪恶的巫师吗?
当你执行eval(baz(回调))时,baz调用callback,eval执行baz的返回值,这是未定义的. eval(undefined)等于eval(‘undefined’),等于undefined.因此,在这种情况下,使用eval本质上是无操作 – 只需执行baz(回调)就可以得到相同的结果.
当你执行eval(qux“(”callback“)”)时,qux“(”callback“)”评估为’baz(函数(响应){resolve(response);})’.当您将其传递给eval时,代码会尝试访问名为resolve的函数,该函数在当前作用域中不存在.这就是为什么它不起作用.如果直接调用函数,它可以访问定义它的作用域中存在的变量,但是如果将函数转换为字符串并将其传递给eval,它只能访问当前作用域中的变量.
内容总结
以上是互联网集市为您收集整理的javascript – eval black magic失去范围全部内容,希望文章能够帮你解决javascript – eval black magic失去范围所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。