浏览器开辟出供代码执行的栈内存后,代码并没有自上而下立即执行,而是先做了一些事(如词法解析、变量提升等)后,再去执行代码
那么何为变量提升?
在代码执行之前,把当前作用域中所有带var、function关键字的,进行提前声明和定义
- 带var的,只是提前声明,没有赋值,默认值是undefined
- 带function的声明并赋值
/*
变量提升 var a; var b;
*/
console.log(a) // undefined
var a = 12
var b = a
b = 13
console.log(a) // => 12
/*
变量提升 function sum(){...}
*/
console.log(sum(15,35)) //50
function sum(n,m) {
return n + m
}
/*
变量提升: var sum;
函数表达式: 使用var 创建sum,变量提升只会声明变量,不会赋值,默认值是undefined
此时函数在前面执行,而函数它此时是没有值的,不能执行,会报错
函数表达式(在真实项目中,更常用,因为它更严谨)
*/
console.log(sum) // =>undefined
sum(10,30) //=> Uncaught TypeError: sum is not a function
var sum = function (n,m) {
return n + m
}
变量提升,容错性更好,但不严谨,ES6语法中的let定义变量更严谨些!!!