【发布时间】:2017-06-07 20:25:58
【问题描述】:
免责声明我不赞同使用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/
【问题讨论】:
-
作为 tl;dr 这里:
eval不会“松散范围”。它在当前范围内(直接评估)或全局(在间接评估的情况下)评估代码。
标签: javascript ecmascript-6 eval es6-promise