根据rollupjs 文档 https://rollupjs.org/guide/en/#eval2--eval:
简单地“复制” eval 为您提供了一个执行完全相同操作的函数,但该函数在全局范围而不是本地范围内运行:
var eval2 = eval;
(function () {
var foo = 42;
eval('console.log("with eval:",foo)'); // logs 'with eval: 42'
eval2('console.log("with eval2:",foo)'); // throws ReferenceError
})();
谁能准确解释这是如何工作的?我找不到任何具体内容eval()
在 ECMAScript 规范中。
Perhaps eval
实际上不是一个函数,而是一个神奇的令牌,它被在该范围内执行代码的函数所取代,有点像这样:
var eval2 = CREATE_EVAL(CURRENT_SCOPE);
(function () {
var foo = 42;
CREATE_EVAL(CURRENT_SCOPE)('console.log("with eval:",foo)'); // logs 'with eval: 42'
eval2('console.log("with eval2:",foo)'); // throws ReferenceError
})();
然而,由于我们在这里处理模块(commonJS 或 ES6),这意味着eval2
实际上在模块范围内运行。 rollupjs 文档特别指出它在全局范围内运行 - 我认为这只是一个疏忽,但当我测试它时,它实际上似乎在全局范围内运行:
var x = 1;
var eval2 = eval;
(function () {
eval2('console.log("with eval2:", x)'); // throws ReferenceError
})();
这太令人困惑了!这到底是如何运作的?为什么复制对 eval 的引用会如此彻底地改变它的行为?