变量提升
JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这叫变量提升。
b = 'hello';
var b ;
console.log(b);
结果是什么呢?
输出:
hello
javascript代码不是一行一行往下执行的。
上面的代码会变成下面的格式
var b;
b = ''hello;
console.log()b;
当出现函数的声明的时候也会有一些改变。
- 函数声明
- 函数表达式
function hello(){
console.log( '函数声明' );
}// 函数声明
var hello= function(){
console.log('函数声明');
}
注意: 函数声明会被提升
例如
display();
function display(){
console.log(a);
var a = 123;
}
输出:
undefined
注意: 函数表达式(匿名表达式)不会被提升
例如
display2();
var display2 = function(){
console.log(a);
var a = 123;
}
输出:
Uncaught TypeError: display2 is not a function
at :1:1
注意: 函数声明和变量声明一样时,函数声明会被提升,变量声明会被忽略。
getname();
var getname = "";
var getname = function(){
console.log(2);
}
function getname(){
console.log(1);
}
getname();
输出:
1
2
可能会有人觉得最后输出的结果是 1。但是 getName 是一个变量,因此这个变量的声明也将提升到顶部,而变量的赋值依然保留在原来的位置。需要注意的是,函数优先,虽然函数声明和变量声明都会被提升,但是函数会首先被提升,然后才是变量。
注意: 在ES5的严格模式下,函数声明不能嵌套在if块内,如问题所示。在非严格模式下,结果是不可预测的。