eval(code) 直接使用时, code 中的Scope是 caller 的 scope.
如果要让 code 无法获取调用者的 scope, 需要使用间接调用( indirect call ). 注意 eval 还是能够获取 global, 并可以对其进行修改.
间接调用的常见方式:
- (1, eval)(code)
- var e = eval; e(code);
- (function(e){e(code)})(eval);
- eval.call(this, code);
- eval('eval')(code);
如果需要让 code 获取到 caller 的 scope, 需要让 eval 的调用处于 scope 中, 因此如果简单的将 eval 封装在一个 function 中会无法获取到 scope.
从外部加在函数的一种方法:
获取函数的字符串形式, 如 (funtion(arg){console.log('hello ' + arg); return 0;})
;
注意最外层需要加括号, 否则 eval 是不会执行函数定义的.
var fun = eval(codeStr); // fun 成为上面定义的函数
fun(param); // 执行函数, 并传入 param 参数.
nodejs 的 vm 模块提供的方法中, 效率较高的是 script.runInThisContext(), 但是效率依然只有 eval 的一半左右 (node v4.2.1);
strict 模式下, eval 中的 var 定义新的参数, 无法传递到 eval 外面.