JavaScript(Hoisting)提升:是JavaScript将声明移动至端部的默认行为。
1.JavaScript声明会被提升
在JavaScript中,可以在使用变量之后对其进行声明,也就是说可以在声明变量之前使用它
但是这并不是说明可以不声明变量而去使用它,因为在严格模式下这样是不合法的。
例子1和例子2的结果相同:
例子1:
x =5;
dmeo = document.getElementById("demo");
demo.innerHTML = x;
var x; //声明x
例子2:
var x;
x = 5;
demo = document.getElementById("demo");
demo.innerHTML = x;
2.let 和const关键字
用let和const声明的变量和常量不会被提升!
详情见:
3.JavaScript初始化不会被提升
JavaScript只提升声明,而非初始化。
先看例子:
例子1:
var x = 5; // 初始化 x
var y = 7; // 初始化 y
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 显示 x 和 y
//结果为: 5 7
例子2:
var x = 5; // 初始化 x
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 显示 x 和 y
var y = 7; // 初始化 y
// 结果:x is 5 and y is undefined
意思就是:可以在为声明前使用变量,到变量必须声明(无论是在使用前);但是不可以在使用之后声明并初始化。因为只有声明而不是初始化被提升到顶部。
y在其被使用前已经被声明,但是由于未对初始化进行提升,所以y的值还是未定义。
例子3跟例子2同理:
var x = 5; // 初始化 x
var y; // 声明 y
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 显示 x 和 y
y = 7; // 把 7 赋值给 y
// 5 undefined
4.在顶部声明变量!!!
为了避免bug,请在每一个作用域的开头声明所有变量。
严格模式下JavaScript 不允许在为被声明的情况下使用变量。
严格模式详见该章-2.2