在复习JS-函数时遇到函数声明提升,回想起之前的变量声明的提升,加上JS无重载一说,若出现同名函数,则后者会覆盖前者。想搞清楚既然变量、函数都能提升,那他们之间的优先级是什么,遂做个小实验验证一下。
其实我是被自己写的一题给绕晕了
1 | console.log(a); |
结论
- 变量声明、函数声明都会提升执行顺序
- 优先级:函数声明 > 变量声明
验证过程如下:
预备知识
变量声明的提升
直接看代码:
1 | console.log(a); |
等价于:
1 | var a; |
这就是变量声明提升–JS中,变量的声明会在其作用域内的最先运行。
函数声明提升
直接看代码:
1 | console.log(a); |
等价于:
1 | function a () {} |
函数表达式声明
函数声明提升不适用于函数表达式,但在判断优先级时可作为很强的干扰项,看代码:
1 | console.log(a); |
其实这个就是变量声明的提升。。。等价于:
1 | var a; |
实验过程
运行环境
- Chrome 63.0.3239.132 (正式版) (64位)
变量声明与函数表达式声明
看代码:
1 | console.log(a); |
结果为控制台打印如下内容:
1 | undefined //变量声明提升 |
变量声明与函数声明
看代码:
1 | console.log(a); |
结果为控制台打印如下内容:
1 | function a () {} //函数声明提升 |
代码等价于:
1 | var a;//变量声明提升 |
这里有个疑问,到底是var a;变量声明提升在前,还是function a 函数声明在前。验证了一下,不管谁在前,运行结果都一样。
个人开始认为应该是 变量 (全局) 声明在前,函数声明提升在后,后者覆盖前者,所以第一个 console.log(a);
打印函数a。
验证:
1 | console.log(window); |
后查阅《You Don’t Know JS:Scope & Closures》的第四章关于声明提升的说法是,function
声明 优先于 var
声明,尽管 var
写在前,但 function
声明优先,var
声明被忽略了。
被忽略了??
emmmm…
函数声明与函数表达式声明
1 | haha(); |
这或许是要看JS引擎源码才能知道答案吧…
所以,
开头那题的答案:
1 | console.log(a); //function a () {console.log("aa")} 函数声明提升至最前 |
参考
- MDN关于函数的讲解
- You-Dont Know-JS:Scope & Closures—Chapter 4: Hoisting
- cnblogs上一篇关于优先级问题的文章
- 极易被忽视的javascript面试题七问七答
本文完。