为何函数value()无法访问调用它的函数内的num变量,却能访问全局num?
JavaScript作用域问题解析
你的问题核心在于JavaScript采用词法作用域(静态作用域),函数的作用域是在定义时确定的,和调用位置无关。
为什么value()访问不到xyz里的num?
value函数定义在全局作用域中,它的作用域链在定义时就固定了——只能访问自身内部和全局作用域的变量,根本触及不到xyz函数的局部作用域。哪怕你在xyz里调用它,它也不会去查找调用位置所在的局部变量,只会按自己定义时的作用域链找变量。所以xyz里的const num = 3对value来说完全不可见。
为什么能访问全局的num=100?
全局作用域是所有函数的“公共作用域”,value定义在全局,自然能访问全局变量。另外你提到全局的num写在value下方却能被访问,是因为JavaScript的变量声明提升——const num的声明会被提升到全局作用域顶部,虽然赋值100在后面,但当xyz()调用value()时,全局的num已经完成初始化,所以能正常输出。
实现预期输出的两种方法
- 方法一:把
value定义在xyz内部,让它处于xyz的作用域中:
function xyz() { const num = 3 function value() { console.log(num) } value() } const num = 100 xyz() // 输出3
- 方法二:把
num作为参数传给value:
function xyz() { const num = 3 value(num) } function value(num) { console.log(num) } const num = 100 xyz() // 输出3
内容的提问来源于stack exchange,提问作者kal_stackO
相关产品推荐
相关产品推荐

