javascript - 包含 "this"关键字的方法在另一个方法中调用时与分配给局部变量时的工作方式不同

标签 javascript constructor this ecmascript-5

<分区>

具有以下代码,当我期望“this”关键字引用全局变量并在缺少 PlayGound 范围变量的情况下显示“Football”时,从我的对象实例调用 Play 方法时输出未定义。

var game = "Football";

function Play() {
  console.log(this.game)
}

function PlayGround() {
  this.Play = Play;
}

var obj = new PlayGround();
obj.Play();

现在,在构造函数级别调用 Play(),不传递它对局部变量的引用,输出为“Football”。

var game = "Football";

function Play() {
  console.log(this.game)
}

function PlayGround() {
  Play();
}

var obj = new PlayGround();

有人可以解释这两种方法表现不同的原因吗?

最佳答案

第一个输出 undefined 非常简单,因为 obj 没有 game 属性。可以这样修复:

var game = "Football";

function Play() {
  console.log(this.game)
}

function PlayGround() {
  this.game = game;
  this.Play = Play;
}

var obj = new PlayGround();
obj.Play();

第二个片段是不好的做法,因为它依赖于 non-strict mode simple calls 的机制为了工作。

如果将第二个片段更改为严格模式,它将出错,因为简单调用中的 thisundefined 而不是 window:

"use strict";

var game = "Football";

function Play() {
  console.log(this.game)
}

function PlayGround() {
  Play();
}

var obj = new PlayGround();

如果你使用 letconst 声明 game,第二个片段将输出 undefined 因为那些顶部-level 声明不附加到全局范围 window:

let game = "Football";

function Play() {
  console.log(this.game)
}

function PlayGround() {
  Play();
}

var obj = new PlayGround();

关于javascript - 包含 "this"关键字的方法在另一个方法中调用时与分配给局部变量时的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53460603/

相关文章:

java - 如何从传递到方法的节点访问信息?

javascript - 全局函数中的 "this"

javascript - 如何阻止变量连接

javascript - 如何从 Highcharts 中的 xAxis 单击事件绘制垂直线?

javascript - 在 Selenium 中,移动到浏览器屏幕上的 (x,y) 不会移动鼠标指针。为什么?

javascript - 自定义过滤器仅搜索特定字段的多个关键字

c++ - 如何使用 vector 和整数作为类的构造函数

Java子类构造函数不调用父类构造函数

jquery - 在 jQuery 函数中使用 "this"

javascript - 在拖动事件的函数内访问 'this'