“this”指的是“window”对象没有按预期工作[重复]

Posted

技术标签:

【中文标题】“this”指的是“window”对象没有按预期工作[重复]【英文标题】:"this" refers to "window" object not working as expected [duplicate] 【发布时间】:2021-01-27 03:29:35 【问题描述】:

我对 this 关键字进行了一些实验,发现了一个奇怪的问题。当一个变量被声明为 var 时,this 正确地引用了这个变量。但是,如果我声明了与 letconst 相同的变量,那么 this 会丢失引用并在控制台中显示未定义。

var prop = "outer"; // not working if let or const.

let foo = 
  prop: "inner",
  show() 
    console.log(this.prop)
  


let a = foo.show;
let b = foo.show.bind(foo);
a()
b()

【问题讨论】:

@adiga 我不相信您标记的副本非常适合这个问题。它确实解释了这个 sn-p 中的 a 调用发生了什么 - 但问题似乎接受了这一点,问题更多的是为什么在使用 letconst 时不会发生这种情况,哪个据我所知,链接的问题根本没有解决。 (虽然我还没有读完所有的cmets。) "this 正确引用此变量。" - 不,这绝不是正确的行为。当然,this 可能会在您不在上下文中调用该方法时以草率模式引用全局对象,但您永远不应该使用那个“特性”。在严格模式下,this 是正确的undefined @RobinZigmond 修复了正确的重复目标 :-) 【参考方案1】:

当您在严格模式之外运行此代码时(如此处),this 关键字默认为全局对象 - 在浏览器中为 window。 (在严格模式下,它会是undefined,所以a() 会抛出一个错误。)

varlet/const 之间的行为差​​异是一个简单的结果,即var 声明的全局变量与全局 (window) 对象上的属性相同,而使用letconst 声明的变量(甚至是全局变量)则不会发生这种情况。

例如见MDN:

就像 const 一样,let 在全局声明时(在最顶层范围内)不会创建窗口对象的属性。

【讨论】:

以上是关于“this”指的是“window”对象没有按预期工作[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Vue This指代

this的使用

我理解的this

js 五 jquery的使用,调用

关于this

说出this的三个应用