怎么理解严格模式下this

发布于 2022-09-04 09:35:51 字数 496 浏览 18 评论 0

JavaScript高级程序设计中有下面这一句话:

在严格模式下,未指定环境对象而调用函数,则 this 值不会转型为 window。 除非明确把函数添加到某个对象或者调用 apply()或 call(),否则 this 值将是 undefined。

我进行了如下的尝试,希望能重点解释setTimeout和全局函数这三个中的this.

"use strict";
(function(){
    console.log(this)//undefined
})();

!function(){
    console.log(this)//undefined
}();

setTimeout(function(){
    console.log(this) //window
},0);

function a(){
    console.log(this);
}
a(); //undefined

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(3

零時差 2022-09-11 09:35:51

为什么我打印的跟你的不一样

clipboard.png

心房敞 2022-09-11 09:35:51

你是想问为什么最后两个也是输出不同?
setTimeout(function(){//setTimeout是window对象的属性(方法),所以很多情况下有window.setTimeout这种写法

console.log(this) //window

},0);
function a(){//这是一个直接申明函数,调用时,this指向window,因为是在严格模式下,所以输出undefined

console.log(this);

}
a();//同时,这种写法和前面两种自调函数的意义其实是一样的,不同的是它有名字,并且手动调用了

许仙没带伞 2022-09-11 09:35:51

在严格模式下,未指定环境对象而调用函数,则 this 值不会转型为 window。 除非明确把函数添加到某个对象或者调用 apply()或 call(),否则 this 值将是 undefined。

setTimeout是window对象的方法,所以在严格模式下输出“window”没有毛病.(因为你把setTimeout里的匿名函数添加到了window对象)

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