Skip to content

Instantly share code, notes, and snippets.

@Chunlin-Li
Last active November 18, 2015 03:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Chunlin-Li/50871f9bdc09ceaf127e to your computer and use it in GitHub Desktop.
Save Chunlin-Li/50871f9bdc09ceaf127e to your computer and use it in GitHub Desktop.
javascript eval

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 外面.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment