为什么这个最里面的匿名函数会属于window对象?

var color = "red";
var obj = {
    color: "pink",
    getColor: function() {
        return function() {
            return this.color
        }
    }
}
alert(obj.getColor()()); //弹出red

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

阅读 3.9k
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);
})();

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题