javascript - 为什么这个最里面的匿名函数会属于window对象?
伊谢尔伦
伊谢尔伦 2017-04-11 13:19:20
[JavaScript讨论组]
var color = "red";
var obj = {
    color: "pink",
    getColor: function() {
        return function() {
            return this.color
        }
    }
}
alert(obj.getColor()()); //弹出red

为什么这个匿名函数会属于window对象?
JS高程上说匿名函数的执行环境具有全局性?我取匿试了试了下
最里面的函数还是属于winddow对象,弹出的还是red。

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
高洛峰

这个, 属于闭包中函数上下文的内容.

要深究他的原因, 其实也比较简单.

this的意思, 就是函数执行时的上下文, 注意是执行时的上下文, 跟函数定义没有关系.

getColor函数返回了这个匿名函数, 匿名函数再执行.

我们理一下:

  1. getColor被obj对象调用.

此时函数已经执行了, getColor函数的this就指向了obj.

  1. getColor返回的函数继续执行.

你告诉我这个函数是被谁调用的? 是obj吗? 显然不是.
那为何你会觉得他的this要指向obj呢?

由于此时函数直接在全局环境中执行, 那么他的this对象就指向了window对象. 必然弹出red.!

高洛峰

如果不考虑bind、call、apply等特殊情况(毕竟这些场景比较容易),那么判断一个函数中的this是啥,实际只需要记住两种情况:

  1. 通过A.fn()形式调用时,thisA

  2. 通过fn()形式调用时,thiswindow

关键区别在于:有没有“点”。

所以:this是什么,跟这个函数定义的形式没有任何关系,所以也不要牵扯闭包之类的。没有关系!

对于你问题中的obj.getColor()(),实际上有两次函数调用:第一次,就是obj.getColor(),显然对于getColor 这个函数,满足第一种情况,this就是obj;第二次,是对obj.getColor()返回的那个函数(记为fn)的调用,跟obj已经没有关系了,即fn() ,有“点”吗?显然没有!所以thiswindow

最后说一句,为什么你们函数调用总是window呢?来看一下:

(function() {
console.log(this);
})();

有“点”吗?当然没有啊!

PHP中文网

obj.getColor这里调用的时候就是在window里调用的吧 然后你代码里面的是closure function 所以obj里的method调用this会是window

PHP中文网

strict模式下会出错,this不再是window,而我们写程序多数在严格模式下,所以这没有意义

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号