# var变量提升和函数声明提升 ## var变量提升 > * var关键字声明的变量,无论实际声明的位置在何处,都会被视为声明在函数的顶部(如果声明不在任意函数内,则视为在全局作用域的顶部) > * JavaScript引擎的工作方式是,先预解析代码, 获取所有被声明的变量和函数声明,然后再一行一行地运行,这就使所有变量声明的语句,都会被提升到代码的头部,这就是变量提升 ```js a = 2 console.log(a) var a = 1 console.log(a) ``` 实际 ```js var a // var声明被提前到顶部, 此时值是undefined a = 2 console.log(a) a = 1 // 赋值还是在原来的位置 console.log(a) ``` ## 函数声明提升 函数定义有三种: 声明式, 函数式, 构造函数 声明式: `function fn (){}` 函数式: `const fn = (){}` 构造函数: `const fn = new Function("a","b","return a+b");` 其中, 声明式有提升效果 > 函数声明语句将会被提升到外部脚本或者外部函数作用域的顶部 ```js f('superman'); function f(name){ console.log(name); } ``` 实际 ```js function f(name){ console.log(name); } f('superman'); ``` 例子: ```js var getName = function(){ console.log(2); } function getName (){ console.log(1); } getName(); // 输出2 ``` 实际 ```js function getName(){ //函数声明提升到顶部 console.log(1); } var getName; //变量声明提升 getName = function(){ //变量赋值依然保留在原来的位置 console.log(2); } getName(); // 最终输出:2 ```