Abruzzi's Wall

Front-End Web Developer

Ghost only can help me to here...


直接与间接调用eval函数

读《Effective Javascript》第17条,由于翻译原因,花了很长时间才搞明白eval的直接调用、间接调用的区别与好恶,为了避免遗忘,记录于此。

首先见代码:

在函数中直接调用执行eval标识符,称为直接调用eval函数,在这种情况下,eval函数所执行的程序将获得eval函数执行时所在作用域访问权限,在上面的代码中,'foo'能直接访问到IIFY中的局部作用域,因此结果输出2

而与直接调用eval函数不同的间接调用如下:

可以看到eval函数通过bar变量间接调用,在这种情况下,eval函数所执行的程序将获得全局(顶级)作用域的访问权限,因此输出结果为1。 在这种间接调用eval函数、获取全局作用域访问权限的情况下,编译器对其优化是远远简单于直接调用eval获取局部作用域访问权限的。

因此在使用eval的过程中应该尽可能间接调用eval函数。

另一种更加间接的间接调用eval函数的方式如下:

结果输出1

这个表达式(0, eval)('foo')工作原理为: 先后对0eval求值,但0被忽略,括号表示的序列表达式最终结果为eval函数,因此整个表达式被视为一种间接调用eval函数的方式。