关于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
相关产品推荐
相关产品推荐

