为何闭包中调用外部定义的函数无法访问词法作用域变量xx?
问题原因解释
首先看你提供的代码:
function outer() { let xx = 0; function inner(fun) { console.log(fun()); fun(); return "ds"; } return inner; } const x = outer(); function fun() { xx++; return xx; } const y = x(fun); console.log(y);
出现ReferenceError的核心原因是JavaScript的词法作用域规则:函数的作用域由它定义时所在的位置决定,和调用时的位置无关。
fun函数是在全局作用域下定义的,它的词法作用域只包含全局环境,根本不存在xx变量(xx是outer函数内部的局部变量,属于outer的私有作用域)。- 虽然
fun是在闭包inner内部被调用的,但这不会改变fun自身的作用域范围。闭包inner确实能访问outer里的xx,但fun和inner是两个独立的函数,fun无法借由调用位置“蹭”到inner或outer的作用域权限。
如果要让fun能访问xx,需要把fun定义在outer的作用域内部,这样它的词法作用域才能覆盖到xx:
function outer() { let xx = 0; function fun() { xx++; return xx; } function inner() { console.log(fun()); fun(); return "ds"; } return inner; } const x = outer(); const y = x(); console.log(y);
内容的提问来源于stack exchange,提问作者kamal joshi
相关产品推荐
相关产品推荐

