在进入函数的执行环境中时,函数的声明会被提前到最开始,如下例子:
var x = 1;
function a() {
alert(x);
var x = 2;
x++;
alert(x);
}
function b() {
alert(x);
x++;
alert(x);
}
if(0 < 100 < 0) {
a();
} else {
b();
}
if(0 < 100 < (0 + 4)) {
a();
} else {
b();
}
其中,if语句都要分两步进行:
第一个if语句:0<100返回true,再将true转换为Number类型,为1,1<0为false,故第一个if语句执行b(),输出结果为:1,2
第二个if语句:0<100返回true,再将true转换为Number类型,为1,1<4为true,故第二个if语句执行a(),此时就要考虑到变量提升问题。
var x = 1;
function a() {
alert(x);
var x = 2;
x++;
alert(x);
}
在函数a中,对变量x又进行了声明,故调用a()时,执行顺序变为:
var x = 1;
function a() {
var x;//此时x的值为undefined
alert(x);
x = 2;
x++;
alert(x);
}
故第二个if语句的输出值为:undefined,3。整个代码的执行结果为:1,2,undefined,3
**********************************************************************************************************************
function f(a){
console.log(a);
var a = 2;
console.log(a);
function a(){};
console.log(a);
}
f(1);
根据已学知识,我们可以得到以上代码的输出结果为:undefined,2,function;
然而并不是!
注:在JS中,存在函数提升,且函数提升优于变量提升。故以上代码在执行时应该转换为:
function f(a){
function a(){};
console.log(a);
var a = 2;
console.log(a);
console.log(a);
}
f(1);
故,输出为:function,2,2