下边的程序会输出2
a=2;
var a;
console.log(a); //2
虽然赋值在声明之前,但是js仍然可以输出2
但是下面的这个程序会输出undefined
console.log(a); //undefined
var a=2;
理解上面的两个程序片段的正确思路:包括变量和函数在内的所有声明都会在任何代码执行之前首先被处理.
所以第二个程序片段被编译器理解为:
var a;
console.log(a); //undefined
a=2;
这样看来变量和函数的声明仿佛被移动到了程序执行的前边。这样变量和函数的声明就被提升了。
所以以下函数也可以被正常的执行。
foo();
function foo() {
console.log(1);
}
但是函数表达式不会被提升
foo();
var foo=function () {
console.log(1);
}
上面这个代码执行的时候会报错。
所以一定要分清函数声明和函数变量定义的表达式的区别:
函数声明: function foo(){}
函数表达式 : var foo=function(){};
提升的过程中函数优先
函数声明和变量声明都会被提升。但是一个值得注意的细节:函数会被优先提升。
foo();
var foo;
function foo() {
console.log(1)
}
foo=function () {
console.log(2);
}
以上的程序会被输出1,原因就是函数会被优先提升。
而且后面加入还有相同的函数声明 的情况下,前边的函数声明会被后边的函数声明覆盖。
foo();
var foo;
function foo() {
console.log(1)
}
foo=function () {
console.log(2);
}
function foo() {
console.log(3);
}
所以覆盖的结果就是以上程序就会输出1