【问题标题】:Do variables referred to without using the this keyword in a Javascript class refer to the global variables?在 Javascript 类中不使用 this 关键字引用的变量是否引用全局变量?
【发布时间】:2021-10-31 07:42:02
【问题描述】:

我试图使用类在节点中制作一个菜单驱动的 JS 程序。我第一次写的代码在语义上是错误的,但它仍然有效。

const read = require('readline-sync')
let flag = 1

class operations {
    
    constructor(num1, num2) {
        this.num1 = num1
        this.num2 = num2
    }

    addition() {
        let sum = num1 + num2
        console.log(num1 + " + " + num2 + " = " + sum)
    }
    subtraction() {
        let diff = num1 - num2
        console.log(num1 + " - " + num2 + " = " + diff)
    }
    multiplication() {
        let prod = num1 * num2
        console.log(num1 + " x " + num2 + " = " + prod)
    }
    division() {
        let quotient = num1 / num2
        console.log(num1 + " / " + num2 + " = " + quotient)
    }

}

do {
    console.log("Enter two numbers ")
    num1 = read.questionInt()
    num2 = read.questionInt()
    let opvar = new operations(num1, num2)
    console.log("Enter your choice of operation\n1.Addition\n2.Subtraction\n3.Multiplication\n4.Division")
    let choice = read.questionInt()
    switch (choice) {
        case 1:
            opvar.addition()
            break
        case 2:
            opvar.subtraction()
            break
        case 3:
            opvar.multiplication()
            break
        case 4:
            opvar.division()
            break
        default:
            console.log("Invalid Entry")
    }

    flag = read.questionInt("Press 1 to continue and 0 to exit ")
}
while (flag === 1)

但是如果没有我在类方法中使用“this”关键字,它是如何工作的呢?所以如果我不使用'this'关键字,类/对象方法会访问同名的全局变量吗? 我是初学者,所以如果这是一个愚蠢的问题,我提前道歉。

【问题讨论】:

  • 如果它们没有在本地定义,即在函数内部,那么是的,它们将被查找范围链直到它到达全局范围。然后在 do...while 循环中使用 num1 = read.questionInt() 行设置全局变量
  • 当使用new关键字调用函数时,该函数是构造函数并返回一个新实例。在这些情况下,“this”指的是新创建的实例。
  • 拜托,请在严格模式下运行您的代码,然后这个accidental 分配给全局变量将被标记为编程错误(它应该是),然后这种事情不会意外发生.将报告错误,您必须修复代码才能正确。 strict 模式是你的朋友。
  • @peter 但是我们不能在构造函数内部或javascript类的方法外部使用'var'、'let'或'const',可以吗?但是我们可以使用那些内部类方法。有点奇怪
  • num1 = read.questionInt() num1 和 num2 是什么,你可能会得到不同的结果

标签: javascript node.js this es6-class


【解决方案1】:

不一定。这取决于创建类的范围。如果它是子范围,JavaScript 将在该范围内查找变量。如果没有指定名称的变量,则在父作用域中查找,直到到达全局作用域或找到变量。

例如,下面有一个在全局范围内创建的类。 val,在print()函数内部,指的是全局变量val

const val = 1;

class Example {
  constructor(val) {
    this.val = val;
  }
  
  print() {
    console.log(val);
  }
}

new Example(2).print();

这里不一样。由于Example 类是在if 块范围内创建的,val 指的是该范围内的val 变量。如果没有任何具有该名称的变量,则将返回全局范围内的值。

const val = 1;

if (true) {
  const val = 3;
  
  class Example {
    constructor(val) {
      this.val = val;
    }

    print() {
      console.log(val);
    }
  }

  new Example(2).print();
}

此外,如果正在打印 val 的函数在其作用域内有一个名为 val 的变量,则该变量的值将被打印。

请务必记住,如果变量是使用 var 创建的,则它不会包含在块范围内(在 if、switch 条件或 for 和 while 循环中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多