[关闭]
@Dale-Lin 2019-08-12T08:26:00.000000Z 字数 773 阅读 911

函数提升和变量提升

JavaScript


先进行变量提升,再进行函数提升!后赋值会覆盖之前的值,但 var 声明多次且不赋值不造成影响。

函数内会先对参数变量进行声明并赋值。


函数提升:

在代码执行之前,解析器会读取并将 函数声明 添加到当前作用域顶端:

alert(sum(10,10));
function sum(num1,num2){
    return sun1+sum2;
}

这段代码可以正常运行。

alert(sum(10,10));
var sum = function(num1,num2){
    return sum1+sm2;
};

这段代码不能正常运行,因为 sum 不是通过 函数声明 形式来定义的,而是通过 函数表达式 来声明的,这样将不会被提升。(函数位于一个初始化语句中)
事实上这段代码等价于:

var sum;
alert(sum(10,10));
sum = function(num1,num2){
    return num1+num2;
};

可以看到 sum 的声明被提升了,但并未储存后面的函数。


变量提升

如上节的第三段代码,在执行代码之前,解析器会把变量提升到当前作用域的顶端:

a = 2;
var a;
document.write(a);  //2

这段代码中a在被赋值时看似未声明,会出现 undefine,但其实解析器在执行赋值之前就把第二行中a的声明提前了,即等价于:

var a;
a = 2;
document.write(a);

对于代码:

var a = 2;

解析器读取时会把它当成两部分:

var a;
a = 2;

而其中对于 a 的声明将被提升到作用域顶端。

  1. function getValue(condition){
  2. if (condition){
  3. var value = 'blue';
  4. } else {
  5. return null;
  6. }
  7. return value;
  8. }

该例中,无论是否有condition = true,value都会被声明。因为ES5没有块级作用域。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注