在 Javascript 类中不使用 this 关键字引用的变量是不是引用全局变量?

Posted

技术标签:

【中文标题】在 Javascript 类中不使用 this 关键字引用的变量是不是引用全局变量?【英文标题】: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 是什么,你可能会得到不同的结果 【参考方案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 循环中)。

【讨论】:

以上是关于在 Javascript 类中不使用 this 关键字引用的变量是不是引用全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 setter 的 'this._obj['a']=2' 在 Dart 类中不起作用

JavaScript 类中的 setTimeout() 使用“this”

派生类中不可用的赋值运算符

为啥我的 javascript 箭头函数在 Edge/IE 中不起作用?

公共方法在另一个类中不可见

如果父类中不存在,则调用子类函数