如何解释下面的两端代码运行结果1a中回调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 defined2let a=fn=>{ x=1;fn();};let b=()=>{console.log(x)};
x; // Uncaught ReferenceError: x is not defineda(b); // 1
3 回答
慕桂英3389331
TA贡献2036条经验 获得超8个赞
作用域是看文法环境的。在1中,首先b的函数作用域中没有变量x的定义,然后就去作用域链的上层去找。这一步很关键,作用域链的上层是‘b函数定义’所在的环境,我们假设b函数是在全局定义的,那b函数作用域的上层就是全局作用域。很明显在全局作用域下没有x变量。 不同是是在2中,定义x时没有用关键字,所以x还就是一个全局变量(也就是在demo和面试题中这么写,项目中会被骂死的)
料青山看我应如是
TA贡献1772条经验 获得超8个赞
变量的作用域链是看你在代码中声明变量时候定好的,和执行时候的读取变量的位置无关。
当程序执行,读取到这个变量时候,就按照声明时候定好的作用域链进行寻找。
- 3 回答
- 0 关注
- 499 浏览
添加回答
举报
0/150
提交
取消