变量提升和函数表达式

先让我们来看个题,测试以下我们的能力:

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 getNamefunction getName都是声明语句,区别在于var getName是函数表达式,而function getName是函数声明。
函数表达式最大的问题在于,会将js会将此代码分为两行执行。

例如:

console.log(x);
var x = 1;
function x(){}

实际执行的代码为,先将var x = 1拆分为var xx = 1两行,然后将var x = 1function x(){}提升至前两行。

所以最终函数声明的x覆盖了变量声明的x,log输出为x函数。

同理,上题的实际执行代码为:

var getName;//只提升变量声明
function getName(){//提升函数声明,覆盖var的声明
    alert|(2);p
}
getName = function(){//最终的赋值再次覆盖function getName声明
    alert(1);
}

getName()//1

你可能感兴趣的:(变量提升和函数表达式)