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

关于Hoisting、作用域与函数声明:代码输出为何不符合预期?

为什么代码输出的是函数而非"test"

这段代码的核心问题出在块级作用域中函数声明的特殊处理规则上:

  • 首先,块里的function a() {}是一个函数声明,在非严格模式下,它会被提升到全局作用域的顶部,提前在全局创建了一个名为a的变量,值就是这个函数。
  • 同时,在块内部,这个函数声明还会创建一个块级的局部绑定——也就是说块里的a其实是一个局部变量,暂时和全局的a同名。
  • 当你执行a = "test"时,你修改的是块内的这个局部a,而非全局的那个a。
  • 等块执行完毕后,块内的局部a绑定会被销毁,全局的a自始至终都没被改动过,所以console.log(a)输出的还是最初的函数。

如果想让全局的a被修改,可以直接指定全局对象(比如浏览器环境里的window.a = "test"),或者用let/const来声明变量,避免这种作用域混淆的问题。


内容的提问来源于stack exchange,提问作者Mahammad Zeynalov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:07:12