先上代码:
var a = '全局变量';
function s(){
console.log(a);
console.log(b);
var b = '局部变量';
}
s();
猜下会输出啥?
控制台最后输出全局变量和undefined。是不是和你想的不太一样。
这就是js的变量提升。
s函数执行时,先进行词法分析,找到var b;变量b的声明先被置于函数作用域的最顶部,只有当程序执行到赋值语句时,才会赋值.
因此按照js顺序执行的方式.会输出undefined.
也可以像下面这样理解变量提升的处理流程:
var a = '全局变量';
function s(){
var b;
console.log(a);
console.log(b);
b = '局部变量';
}
s();
这是因为在 JavaScript 中执行上下文的工作方式造成的。函数声明也会被提升,因为函数也是变量。
函数提升仅适用于函数声明(函数声明整体提升),函数表达式例外
从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中
函数和变量相比,会被优先提升。这意味着函数会被提升到更靠前的位置。