关于js作用域的问题?

如何解释下面的两端代码运行结果

1

a中回调b,b打印x。b为什么拿不到a中的x;

let a=fn=>{const x=1;fn();};let b=()=>{console.log(x)};

a(b);  //Uncaught ReferenceError: x is not defined

2

let a=fn=>{ x=1;fn();};let b=()=>{console.log(x)};

x;   // Uncaught ReferenceError: x is not defineda(b); // 1


DIEA
浏览 560回答 3
3回答

慕桂英3389331

作用域是看文法环境的。在1中,首先b的函数作用域中没有变量x的定义,然后就去作用域链的上层去找。这一步很关键,作用域链的上层是‘b函数定义’所在的环境,我们假设b函数是在全局定义的,那b函数作用域的上层就是全局作用域。很明显在全局作用域下没有x变量。 不同是是在2中,定义x时没有用关键字,所以x还就是一个全局变量(也就是在demo和面试题中这么写,项目中会被骂死的)

料青山看我应如是

变量的作用域链是看你在代码中声明变量时候定好的,和执行时候的读取变量的位置无关。当程序执行,读取到这个变量时候,就按照声明时候定好的作用域链进行寻找。
打开App,查看更多内容
随时随地看视频慕课网APP