var color = "red";
var obj = {
color: "pink",
getColor: function() {
return function() {
return this.color
}
}
}
alert(obj.getColor()()); //弹出red
为什么这个匿名函数会属于window对象?
JS高程上说匿名函数的执行环境具有全局性?我取匿试了试了下
最里面的函数还是属于winddow对象,弹出的还是red。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这个, 属于闭包中函数上下文的内容.
要深究他的原因, 其实也比较简单.
this的意思, 就是函数执行时的上下文, 注意是执行时的上下文, 跟函数定义没有关系.
getColor函数返回了这个匿名函数, 匿名函数再执行.
我们理一下:
getColor被obj对象调用.
getColor返回的函数继续执行.
由于此时函数直接在全局环境中执行, 那么他的this对象就指向了window对象. 必然弹出red.!
如果不考虑bind、call、apply等特殊情况(毕竟这些场景比较容易),那么判断一个函数中的this是啥,实际只需要记住两种情况:
通过
A.fn()形式调用时,this是A。通过
fn()形式调用时,this是window。关键区别在于:有没有“点”。
所以:
this是什么,跟这个函数定义的形式没有任何关系,所以也不要牵扯闭包之类的。没有关系!对于你问题中的
obj.getColor()(),实际上有两次函数调用:第一次,就是obj.getColor(),显然对于getColor这个函数,满足第一种情况,this就是obj;第二次,是对obj.getColor()返回的那个函数(记为fn)的调用,跟obj已经没有关系了,即fn(),有“点”吗?显然没有!所以this是window。最后说一句,为什么你们函数调用总是
window呢?来看一下:有“点”吗?当然没有啊!
obj.getColor这里调用的时候就是在window里调用的吧 然后你代码里面的是closure function 所以obj里的method调用this会是window
strict模式下会出错,this不再是window,而我们写程序多数在严格模式下,所以这没有意义