eval是在caller的作用域里运行传给它的代码:

var x = 'outer';
  (function() {
    var x = 'inner';
    eval('x'); // "inner"
  })();
 
在 ES5,可以分为direct调用或者indirect调用,和是否在strict模式调用
 
(1,eval)('1+1')  为indirect调用,(1,eval)仍然返回一个eval函数
同样下面这些也是非直接调用:
(eval, eval)('...')
(1 ? eval : 0)('...')
(__ = eval)('...')
var e = eval; e('...')
(function(e) { e('...') })(eval)
(function(e) { return e })(eval)('...')
(function() { arguments[0]('...') })(eval)
this.eval('...')
this['eval']('...')
[eval][0]('...')
eval.call(this, '...')
eval('eval')('...')
 
只有在eval指向standard, built-in function(eval没有被覆盖或者不是复制品),才是direct调用:
eval = (function(eval) {
    return function(expr) {
      return eval(expr);
    };
  })(eval);
 
  eval('1+1'); // It looks like a direct call, but really is an indirect one.   It's because `eval` resolves to a custom function, rather than standard, built-in one
 
下面这些都是direct调用:
  eval('...')
  (eval)('...')
  (((eval)))('...')
  (function() { return eval('...') })()
  eval('eval("...")')
  (function(eval) { return eval('...'); })(eval)
  with({ eval: eval }) eval('...')
  with(window) eval('...')
 
eval是引用指针的话,都为直接调用,如果为值的话,为间接调用
eval('1+1')这里的eval是引用,需要被执行,执行之后就是一个标准的,内置的 function对象
(1,eval)('1+1')的话,(1,eval)执行结果为一个值,不是一个引用
(eval)执行结果仍然为一个引用,不是值,因为小括号不会执行它里面的表达式(does not evaluate its expression),所以传一个引用进去,返回的仍然是引用
 
 

最新文章

  1. Android事件分发小结
  2. Spring SpringMVC和Mybatis整合
  3. 2016.5.27 php测试中敏感度高,怎么调整
  4. 10. 星际争霸之php设计模式--原型模式
  5. 10-20日 && 抽签问题
  6. 一个项目软件的大小基本都占用在外部引用的jar包上了。
  7. C 的 一些写法格式 交流
  8. hdu 5281 Senior's Gun
  9. [iOS微博项目 - 3.4] - 获取用户信息
  10. 引入第三方库错误Undefined symbols for architecture i386: _OBJC_CLASS_$的解决方案
  11. Objective-C中的Block(闭包) (轉載)
  12. Replication--进程无法在“xxxx”上执行“sp_replcmds”
  13. JavaScript(1)——变量、函数声明及作用域
  14. 高效sql2005分页存储过程
  15. ionic 禁用 手势 滑动返回
  16. Unity3D 中 脚本(MonoBehaviour) 生命周期WaitForEndOfFrame需要注意的地方
  17. Javascript高级编程学习笔记(41)—— DOM(7)DocumentFragment类型
  18. table无法控制宽度
  19. tomcat配置内存
  20. Python进行MySQL数据库操作

热门文章

  1. 一步一步带你做WebApi迁移ASP.NET Core2.0
  2. 用ESP8266+android,制作自己的WIFI小车
  3. 【BZOJ】1015 [JSOI2008]星球大战starwar(并查集+离线处理)
  4. 基于LoadRunner11,以wifi热点方式录制APP脚本简单指导
  5. DotNetCore跨平台~配置文件与配置代码如何共存
  6. Unity 使用 陀螺仪 实现 《王者荣耀》 登入界面 背景动态效果
  7. JS中的类型识别
  8. uva 10118,记忆化搜索
  9. IDEA启动后页面没有tomcat server选项,显示灰色问号和红叉不能使用
  10. Centos7安装后出现please make your choice from '1' to e 解决方式