# 变量提升
在使用javascript编写代码的时候, 我们知道, 声明一个变量用var, 定义一个函数用function.那你知道程序在运行它的时候, 都经历了什么吗?
# 变量声明提升
首先是用var定义一个变量的时候, 例如:
var a = 10;
@前端进阶之旅: 代码已经复制到剪贴板
大部分的编程语言都是先声明变量再使用, 但是javascript有所不同, 上面的代码, 实际相当于这样执行:
var a;
a = 10;
@前端进阶之旅: 代码已经复制到剪贴板
因此有了下面这段代码的执行结果:
console.log(a); // 声明,先给一个默认值undefined;
var a = 10; // 赋值,对变量a赋值了10
console.log(a); // 10
@前端进阶之旅: 代码已经复制到剪贴板
上面的代码👆在第一行中并不会报错Uncaught ReferenceError: a is not defined, 是因为声明提升, 给了a一个默认值.
这就是最简单的变量声明提升.
# 函数声明提升
定义函数也有两种方法:
- 函数声明:
function foo () {}; - 函数表达式:
var foo = function () {}.
第二种函数表达式的声明方式更像是给一个变量foo赋值一个匿名函数.
那这两种在函数声明的时候有什么区别吗?
案例一🌰:
console.log(f1) // function f1(){}
function f1() {} // 函数声明
console.log(f2) // undefined
var f2 = function() {} // 函数表达式
@前端进阶之旅: 代码已经复制到剪贴板
可以看到, 使用函数声明的函数会将整个函数都提升到作用域(后面会介绍到)的最顶部, 因此打印出来的是整个函数;
而使用函数表达式声明则类似于变量声明提升, 将var f2提升到了顶部并赋值undefined.
我们将案例一的代码添加一点东西:
案例二🌰:
