关于this的问题
function foo() { "use strict";
console.log( this.a );
}
var a = 2;
foo();
使用严格模式,默认绑定无法到达全局,出现undefined这个可以理解
但是
用一个匿名函数就:
function foo() {
console.log( this.a );
}
var a = 2;
(function(){
"use strict";
foo(); // 2
})();
这要如何理解,这里的this不是应该指向匿名函数?调用栈不是全局=>匿名函数=>foo?
补充:疑惑在于为什么第二种写法会是那样的结果。
备注:讨论只局限在es3范畴,请不要用胖箭头它的this指向和es3不同
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
不应该是这样吗
或者这样?
我应该解答了啊...
不是,上面的箭头函数的才是...
this
的绑定方式你可以参考https://github.com/getify/You...
只有箭头函数的情况下才是词法作用域
你直接调用
foo()
默认绑定 没use strict
绑定到全局变量window
函数里的
this
不是取决于函数放在哪里运行,而是函数的运行方式到底是func()
还是bla.func()
。两次用use strict的位置根本就不一样好么。
第一次是用在foo函数里面,对foo函数生效,第二次是用在匿名函数里面,对匿名函数生效,你匿名函数里面调用foo是对全局变量foo得引用,所以foo函数本身根本就不是严格模式,不然你把第二个use strict也放到foo函数里面试试??那样得到的结果也是肯定也是undefined
没看过es3的标准,只看过es5。在es5规范中this是这样确定的:
如果 函数代码 是 严格模式下的代码 ,设 this 绑定为 thisArg。(严格模式直接使用调用者传入的thisArg)
否则如果 thisArg 是 null 或 undefined,则设 this 绑定为 全局对象 。(非严格模式时会把null和undefined转为全局对象)
否则如果 Type(thisArg) 的结果不为 Object,则设 this 绑定为 ToObject(thisArg)。(另外如果thisArg不是对象,会转为对象)
否则设 this 绑定为 thisArg。(非严格模式下最后的绑定)
那么这个thisArg又是怎么确定的呢?它取决于括号左边的那个东西(调用者),举例来说foo(),就取决于foo。如果foo是引用对象,那么thisArg就是引用对象的base属性;如果不是引用对象,那么thisArg就是null。当然还有一些特殊情况,你可以看汤姆大叔的系列文章中的this一文了解。
回到你这个问题:
首先,这个立即执行函数,它的括号左边不是引用类型,又因为他启用了严格模式,所以在立即执行函数内,this是undefined或null。而foo()这个调用,foo是引用类型,并且它的base是global。所以在调用是this便是global。不过这里有一个问题我也十分疑惑,按楼上所说的在foo中加入use strict后,this变为了undefined。这与汤姆大叔的理论有出入,我也在它的博客后留言了。我查看了es5标准,也没有对于严格模式下thisArg的这个问题很好的解释!
对于默认绑定来说,决定this绑定对象的并不是调用位置是否处于严格模式,而是函数体是否处于严格模式。如果函数体处于严格模式,this会被绑定到undefined,否则this会被绑定到全局对象。