“this”指的是“window”对象没有按预期工作[重复]
Posted
技术标签:
【中文标题】“this”指的是“window”对象没有按预期工作[重复]【英文标题】:"this" refers to "window" object not working as expected [duplicate] 【发布时间】:2021-01-27 03:29:35 【问题描述】:我对 this 关键字进行了一些实验,发现了一个奇怪的问题。当一个变量被声明为 var 时,this 正确地引用了这个变量。但是,如果我声明了与 let 或 const 相同的变量,那么 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
调用发生了什么 - 但问题似乎接受了这一点,问题更多的是为什么在使用 let
或 const
时不会发生这种情况,哪个据我所知,链接的问题根本没有解决。 (虽然我还没有读完所有的cmets。)
"this
正确引用此变量。" - 不,这绝不是正确的行为。当然,this
可能会在您不在上下文中调用该方法时以草率模式引用全局对象,但您永远不应该使用那个“特性”。在严格模式下,this
是正确的undefined
。
@RobinZigmond 修复了正确的重复目标 :-)
【参考方案1】:
当您在严格模式之外运行此代码时(如此处),this
关键字默认为全局对象 - 在浏览器中为 window
。 (在严格模式下,它会是undefined
,所以a()
会抛出一个错误。)
var
和 let
/const
之间的行为差异是一个简单的结果,即var
声明的全局变量与全局 (window
) 对象上的属性相同,而使用let
或const
声明的变量(甚至是全局变量)则不会发生这种情况。
例如见MDN:
就像 const 一样,let 在全局声明时(在最顶层范围内)不会创建窗口对象的属性。
【讨论】:
以上是关于“this”指的是“window”对象没有按预期工作[重复]的主要内容,如果未能解决你的问题,请参考以下文章