以下是知乎上的两个回答,分别从宏观和微观的角度分析这个原因。

1.微观角度

作者:franky
链接:https://www.zhihu.com/question/21958425/answer/19858492
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这个问题的官方答案就是,ES3时代设计上就是故意如此. 但是准确的表述并不和 匿名函数直接关联. 只是匿名函数符合函数调用时的某个规则而已.

因为一些生产环境代码经常无意中进入某种陷阱或带来一些代码的逻辑性断层. 导致ES5时代,在严格模式中.把原有this的行为做了修正.

现在我来说说那个所谓某个规则是什么..

准确来说,我们抛开 call,和apply . 那么影响this 的就是 Property accessor 语法.
即 obj.foo() ; 属性访问语法,即函数调用运算符"()" 左边部分. 会获取一个 base 为obj 的 referenceType . 然后进行函数调用运算. 则referenceType.base 会为该函数执行环境的this 提供引用.

你想消除referenceType 很简单 (1,obj.foo)() 这样就行了. 因为 分组运算符的加入.导致提前对 referenceType进行getValue 操作. 直接拿到函数对象进行函数调用运算.导致提供给该函数执行环境关联的this值是null. ES3明确表述,当此类情形发生时.则把global作为 this. ES5 的严格模式则修正了这一规则.

忘了补充下,你所谓的匿名函数在函数调用时是什么. 举个例子.

(function(){this === global}());

就拿常用的例子来说. 外层分组运算符的作用是让 匿名函数表达式合法. 因 javascript 语法限制. 禁止函数表达式中, function 关键字出现在表达式的第一个token位置. so. 必须借助其他辅助语法来完成所谓匿名函数的立即调用..比如 赋值表达式,逗号运算等等.
显然匿名函数解释执行的结果不是一个referenceType .但是规则中有表述,当不是referenceType时. 仍然把null (undefined-SE5) 作为this 提供给该函数执行环境.

那么你看到上面所谓匿名函数调用(函数立即调用表达式). 和平时的 函数直接调用有啥区别么?
var fn = function(){this === null};

fn();

答案是有. fn(); 这玩意其实解释执行fn时还是有referenceType .但是其base 是ES3世道的变量对象. 此时仍然把null 作为this. 然后又符合那种规则了.

2.宏观角度

作者:

从作用域和调用链方面看就很好理解了, 匿名函数是一个没有指针的全局变量,那么它的this指向的就是全局 就是window对象。这并不是设计缺陷,这种调用很安全,通过window并不能找到这个匿名函数,因为匿名函数没有指针。

转载于:https://www.cnblogs.com/FunkyEric/p/9046514.html

匿名函数的this指向为什么是window?相关推荐

  1. 执行多个window.onload匿名函数的方法

    业务需求:在body里面创建一个div元素,点击div元素能够复制div节点,将复制后的div加载到原有的div节点后面,并且重新设置克隆后的div节点的样式. JS代码特点:在JS语句中有两个win ...

  2. 箭头函数 改变this指向

    1.箭头函数 <div>我是div</div><script>const oDiv = document.querySelector('div');// 普通函数o ...

  3. 匿名函数、普通函数、箭头函数作用域

    匿名函数 /*************************************** * 匿名函数的this指向具有全局性 * 当this在函数内找不到时,会去全局查找 /*********** ...

  4. window.onload匿名函数中element.onclick正确用法

    先看下面有问题的代码: <!DOCTYPE html> <html lang="en"> <head><meta charset=&quo ...

  5. 【转】js之匿名函数

    这篇博文内容来自于javascript高级程序设计第2版,向作者致敬 函数声明: function functionName(arg0,arg1){ //函数体 } 函数表达式: var functi ...

  6. Javascript进阶:匿名函数详解

    匿名函数:意如其名,就是没有名字的函数. function (arg1,arg2){..... } 匿名函数的普遍用法: 1.赋值给变量: var func=function(arg1,arg2){. ...

  7. 匿名函数 闭包 ( 7 章 )

    1: function functionName(arg0,arg1){ 2: 3: 4: 5: } 6: 7: var functionName = function( arg0 , arg1 ){ ...

  8. Javascript高级程序设计第二版第七章匿名函数--笔记

    匿名函数就是没有名字的函数,有时候也称为拉姆达(lambda)函数. function functionName(){}; 这是一个函数声明 在代码执行以前被加载到作用域中 var functionN ...

  9. 函数类型:有参函数、无参函数、匿名函数、回调函数、立即执行函数、闭包函数、递归函数...

    1.有参函数:函数定义时,带有参数的函数 设置函数参数的默认值: (1)直接在函数定义位置的小括号内进行赋值 (2)低版本默认值的处理(在函数内部判断该参数是否有默认值,若没有,赋值初始值) 第1种默 ...

最新文章

  1. 上海网络推广浅析一个优质的404页面能给网站带来什么优化效果?
  2. 查看selenium python的api小记录
  3. javabean反射改字段内容_JSP第三篇「JavaBean的介绍、JSP的行为--JavaBean」(修订版)...
  4. 独门绝技:一招克死所有病毒(转贴,没有用过)
  5. oracle12c常用新特性,开发者必读:Oracle12c新特性再总结
  6. html表单如何提示信息,表单提示信息
  7. Linux运维工程师必看:如何成为一个合格的运维工程师
  8. 树莓派和电脑之间串口通信
  9. CMD控制台光标无法显示
  10. 南京软件测试女薪资2019,2019年第一扎!南京最新平均工资最新出炉,看完不敢过年!...
  11. python程序判断梅森素数_梅森素数的探索之旅
  12. fastboot烧录镜像--VTSGSI镜像替换
  13. 四狂神战记2部分攻略
  14. 上海2021高考小三门成绩查询,上海高考小三门怎么算分?附上海小三门等级对应分数...
  15. 生产者消费者算法的实现
  16. 取Json中的数组进行遍历
  17. NGR-PEG-6-FAM 肿瘤新生血管靶向肽NGR-聚乙二醇-6-羧甲基荧光素
  18. 德国电信撕逼诺基亚:史上最烂5G供应商
  19. 直角杨辉三角形(C)
  20. 10个极简python代码,拿走即用

热门文章

  1. [转]php socket编程通信
  2. javascript回车完美实现tab切换功能
  3. C# ListT用法
  4. AndroidのUI设计研究(一)——自定义ProgressBar
  5. c#_文件的保存与读取
  6. kindeditor上传图片php,Kindeditor编辑器添加图片上传水印功能(php代码)
  7. awk 分隔符_awk 中的字段、记录和变量 | Linux 中国
  8. spark用python编程的书_PySpark实战指南:利用Python和Spark构建数据密集型应用并规模化部署...
  9. java 从mysql 导出到excel_JAVA实现在数据库导出到EXCEL并下载
  10. 9.QML Qt Quick Controls 2中常用的界面形式——并排式界面(SwipeView)