先让我们来看个题,测试以下我们的能力:
var getName = function () { alert (1);};
function getName() { alert (2);}
getName();
大家作出答案了吗?没做出来,不要急,下面我们就一起来分析以下。
变量声明提升
即所有声明变量或声明函数都会被提升到当前函数的顶部。
例如:
console.log(x);
var x;
x=0;
浏览器在执行的时候,js引擎会把声明语句提到最前面,如下:
var x;
console.log(x);
x=0;
函数表达式
var getName
和function getName
都是声明语句,区别在于var getName
是函数表达式,而function getName
是函数声明。
函数表达式最大的问题在于,会将js会将此代码分为两行执行。
例如:
console.log(x);
var x = 1;
function x(){}
实际执行的代码为,先将var x = 1
拆分为var x
和x = 1
两行,然后将var x = 1
和function x(){}
提升至前两行。
所以最终函数声明的x覆盖了变量声明的x,log输出为x函数。
同理,上题的实际执行代码为:
var getName;//只提升变量声明
function getName(){//提升函数声明,覆盖var的声明
alert|(2);p
}
getName = function(){//最终的赋值再次覆盖function getName声明
alert(1);
}
getName()//1
网友评论