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

JavaScript变量提升疑问:如何访问特定变量?

JavaScript变量提升常见疑问解答

疑问1:先声明的函数为何能调用后声明的函数?

你贴的代码里,两个函数都是函数声明,这类声明会被JavaScript引擎完整提升到当前作用域的最顶端——不管你在代码里写的先后顺序如何。

引擎在预处理阶段,会把fn和callback的完整函数体都移到全局作用域的顶端,相当于实际执行的逻辑是:

function fn() {
  callback();
}
function callback() {
  console.log('why does this show');
}

所以当fn被调用时(如果补充调用语句的话),callback已经是一个完全可用的函数了,自然能正常执行。这和顶层对象无关,就是函数声明的核心提升规则:作用域内所有函数声明在预处理阶段就已全部就位,互相可访问。

疑问2:被提升的函数为何能访问后赋值的变量?

这里要区分变量声明提升和赋值操作的执行时机:
var a = 10这条语句会被引擎拆成两个独立步骤:

  1. 变量声明var a——这部分会被提升到作用域顶端
  2. 赋值操作a = 10——这部分会留在原代码位置,按顺序执行

同时,函数fn的声明也会被提升到顶端,所以实际执行的逻辑顺序是:

// 提升后的变量声明(此时a为undefined)
var a;
// 提升后的函数声明
function fn() {
  console.log(a);
}
// 原位置的赋值操作(此时a被设为10)
a = 10;
// 调用函数(此时a已经完成赋值)
fn();

你之前的误区是混淆了「预处理的提升阶段」和「代码的执行阶段」:提升只是把声明移到顶端,但函数调用是在赋值操作完成之后才执行的,所以fn运行时,a已经有了10这个值,自然能输出正确结果。

内容的提问来源于stack exchange,提问作者713sean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:30:47