【问题标题】:"this" refers to "window" object not working as expected [duplicate]“this”指的是“window”对象没有按预期工作[重复]
【发布时间】: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 修复了正确的重复目标 :-)

标签: javascript


【解决方案1】:

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

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

例如见MDN:

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

【讨论】:

    猜你喜欢
    • 2017-04-04
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2012-11-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多