关于this的问题

发布于 2022-09-03 15:20:41 字数 476 浏览 19 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

魄砕の薆 2022-09-10 15:20:41
 var a = 2;
    function foo() { 
        "use strict";
        console.log( this.a );
    }

    (function(){
        foo(); // 报错
    })();

不应该是这样吗

或者这样?

var a = 2;
(function () {
    "use strict";
    (()=> {
        console.log(this.a);
    })(); // 报错
})();

我应该解答了啊...

调用栈不是全局=>匿名函数=>foo?

不是,上面的箭头函数的才是...
this的绑定方式你可以参考
https://github.com/getify/You...

只有箭头函数的情况下才是词法作用域

你直接调用foo()默认绑定 没use strict 绑定到全局变量window

var a = 2;
function foo() {
    console.log( this.a );
}
(function(){
    "use strict";
    (()=>{ foo();})(); // 也是2啊,结果 
})();
情话难免假 2022-09-10 15:20:41

函数里的 this 不是取决于函数放在哪里运行,而是函数的运行方式到底是 func() 还是 bla.func()

緦唸λ蓇 2022-09-10 15:20:41

两次用use strict的位置根本就不一样好么。
第一次是用在foo函数里面,对foo函数生效,第二次是用在匿名函数里面,对匿名函数生效,你匿名函数里面调用foo是对全局变量foo得引用,所以foo函数本身根本就不是严格模式,不然你把第二个use strict也放到foo函数里面试试??那样得到的结果也是肯定也是undefined

遗弃M 2022-09-10 15:20:41

没看过es3的标准,只看过es5。在es5规范中this是这样确定的:

  1. 如果 函数代码 是 严格模式下的代码 ,设 this 绑定为 thisArg。(严格模式直接使用调用者传入的thisArg)

  2. 否则如果 thisArg 是 null 或 undefined,则设 this 绑定为 全局对象 。(非严格模式时会把null和undefined转为全局对象)

  3. 否则如果 Type(thisArg) 的结果不为 Object,则设 this 绑定为 ToObject(thisArg)。(另外如果thisArg不是对象,会转为对象)

  4. 否则设 this 绑定为 thisArg。(非严格模式下最后的绑定)

那么这个thisArg又是怎么确定的呢?它取决于括号左边的那个东西(调用者),举例来说foo(),就取决于foo。如果foo是引用对象,那么thisArg就是引用对象的base属性;如果不是引用对象,那么thisArg就是null。当然还有一些特殊情况,你可以看汤姆大叔的系列文章中的this一文了解。

回到你这个问题:

function foo() { 
    console.log( this.a );
}
var a = 2;
(function(){
    "use strict";
    foo(); // 2
})();

首先,这个立即执行函数,它的括号左边不是引用类型,又因为他启用了严格模式,所以在立即执行函数内,this是undefined或null。而foo()这个调用,foo是引用类型,并且它的base是global。所以在调用是this便是global。不过这里有一个问题我也十分疑惑,按楼上所说的在foo中加入use strict后,this变为了undefined。这与汤姆大叔的理论有出入,我也在它的博客后留言了。我查看了es5标准,也没有对于严格模式下thisArg的这个问题很好的解释!

世界和平 2022-09-10 15:20:41

对于默认绑定来说,决定this绑定对象的并不是调用位置是否处于严格模式,而是函数体是否处于严格模式。如果函数体处于严格模式,this会被绑定到undefined,否则this会被绑定到全局对象。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文