Javascript 通过实例方法和此执行上下文访问JS类/对象变量

Javascript 通过实例方法和此执行上下文访问JS类/对象变量,javascript,ecmascript-6,es6-class,arrow-functions,executioncontext,Javascript,Ecmascript 6,Es6 Class,Arrow Functions,Executioncontext,第一个问题:为什么getXArrow中的值等于Solution对象?它不应该等于调用它的解决方案对象的这个值吗?它将是窗口对象 第二个问题:JS引擎是否应该沿着每个函数的作用域链向上移动以找到x的值?getX和getXArrow的作用域没有x,因此JS引擎将检查它们的调用者解决方案对象,并找到x:10,如构造函数中声明的那样。相反,它似乎跃升到了全球范围 let x = 5 class Solution { constructor() { this.x = 10

第一个问题:为什么getXArrow中的值等于Solution对象?它不应该等于调用它的解决方案对象的这个值吗?它将是窗口对象

第二个问题:JS引擎是否应该沿着每个函数的作用域链向上移动以找到x的值?getX和getXArrow的作用域没有x,因此JS引擎将检查它们的调用者解决方案对象,并找到x:10,如构造函数中声明的那样。相反,它似乎跃升到了全球范围

let x = 5
class Solution {
    constructor() {
        this.x = 10
    }
    getX() {
        console.log(this); 
        console.log(x); 
    }
    getXArrow = () => {
        console.log(this); 
        console.log(x); 
    }
}

s.getXArrow() // Output: Solution
              //         5
s.getX()      // Output: Solution
              //         5

谢谢大家!

getX只有两个可访问的作用域:它自己的函数作用域和全局作用域。类不创建作用域,因此无法访问x。但是,您确实可以通过该方法访问实例,并且可以访问其.x属性。

默认情况下,类方法的属性是实例对象本身。类成员不像在其他语言中那样被提升到词汇范围内;您必须使用这个.x来实现xJS具有词法作用域,调用方是谁并不重要。脚本中只有一个x变量-属性不是变量。请在每篇文章中只问一个问题。顺便说一句,你的第一个问题可以很容易地研究箭头函数是如何工作的。