You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何闭包中调用外部定义的函数无法访问词法作用域变量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:14:58