为了账号安全,请及时绑定邮箱和手机立即绑定

关于js作用域的问题?

关于js作用域的问题?

DIEA 2018-07-14 12:06:21
如何解释下面的两端代码运行结果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和面试题中这么写,项目中会被骂死的)

查看完整回答
反对 回复 2018-07-15
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

变量的作用域链是看你在代码中声明变量时候定好的,和执行时候的读取变量的位置无关。
当程序执行,读取到这个变量时候,就按照声明时候定好的作用域链进行寻找。

查看完整回答
反对 回复 2018-07-15
  • 3 回答
  • 0 关注
  • 499 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信