JavaScript变量作为函数调用的执行过程及代码结果疑问解析
JavaScript变量作为函数调用的执行流程及代码解析
一、代码中function a(){}的含义
这是一个函数声明,在show函数的局部作用域中声明了一个名为a的空函数。函数声明的特性是会被JavaScript引擎优先提升到当前作用域的顶部,优先级高于变量声明。
二、为什么全局变量a的值为5?
核心原因是变量提升和作用域隔离,拆解show函数的执行过程就能明白:
- 预编译阶段:当
show函数被调用时,JavaScript会先处理作用域内的所有声明。函数声明function a(){}会被提升到show局部作用域的最顶端,相当于提前在show内部创建了局部变量a,指向这个空函数。此时局部的a和全局的a已经完全隔离,互不影响。 - 执行阶段:
- 执行
a=10;时,这里的a是已经被提升的局部变量,所以只是把局部的a从函数类型赋值为数值10,完全没触及全局的a。 - 后续的
function a(){};因为预编译阶段已经处理过,执行阶段不会产生任何实际作用。 - 最后
return a;返回的是局部作用域里的a(也就是10)。
- 执行
- 全局作用域:全局的
a从始至终都是初始赋值的5,因为show内部操作的是自己的局部变量,没有对全局变量做任何修改。
三、变量被当作函数调用的执行流程
如果要把变量当作函数调用,前提是这个变量的值必须是函数类型(函数声明、函数表达式、箭头函数等),执行流程大致如下:
- 解析变量,找到它指向的函数对象。
- 为该函数创建新的执行上下文,处理内部的变量提升、参数传递逻辑。
- 逐行执行函数体中的代码。
- 执行完毕后销毁执行上下文(除非有闭包引用),返回指定结果(如果有
return语句)。
如果变量不是函数类型,调用时会直接抛出TypeError: xxx is not a function的错误。
内容的提问来源于stack exchange,提问作者Soumi Ghosh
相关产品推荐
相关产品推荐

