变量提升

Posted boses

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了变量提升相关的知识,希望对你有一定的参考价值。

首先先看一段代码

a;
var a = 10;

不知道大家猜的结果是什么,是报错?还是是10,亦或者是undefined,

正确答案是undefined,之所以出现这种情况是因为变量提升到了当前作用域的顶部。

可以这样理解上面的代码

 

var a;
console.log(a);
a = 10;

 

可以清楚看到结果。 但是如果是一个函数呢?

 

foo();
function foo() {};

这里的运行结果会出现什么情况呢? 报错还是正常运行呢?

答案是正常运行,这里的函数声明同样会被前置到当前作用域的顶层,类似下面代码

 

function foo() {};
foo();

上面就是变量提升的基本规则。

 

 

下面来看一些比较复杂的例子

 

foo();
var foo;
function foo() {
    bar();
    console.log(a);
    var a = 10;
    function bar() {
    
    }
}

 

这里会正常运行,首先代码在编译过程中会先将函数声明和变量声明前置,

这里又涉及到一个规则,就是函数声明优先于变量声明

上面的例子,会首先将foo()函数声明提升到头部,之后在编译过程中发现已经有foo,变量var foo;这句声明会被忽略掉。

执行的就是下面这段代码

 

function foo() {
    bar();
    console.log(a);
    var a = 10;
    function bar() {
    
    }
}
foo();

 

 在foo内部,我们直接运行a会返回一个undefined,可以看到在全局作用域和函作用域内部都会进行变量提升。

 

如果存在多个函数声明呢?

 

foo(); //3
function foo() {
    console.log(1);
}
function foo() {
    console.log(1);
}
function foo() {
    console.log(2);
} 
function foo() {
    console.log(3);
}
var foo = 15;

 

这里输出的结果是3,因为后面的函数声明会覆盖前面的代码。

 

如果是函数表达式呢?

 

foo(); //TypeError: foo is not a function
var foo = 15;
var foo = function() {
console.log(10);

 

这里会报错,可以看到函数表达式不会像函数声明一样将代码提升到头部,这里因为foo是undefined,这里运行会得到一个错误结果。

以上是关于变量提升的主要内容,如果未能解决你的问题,请参考以下文章

十条jQuery代码片段助力Web开发效率提升

十条jQuery代码片段助力Web开发效率提升

如何创建片段以重复变量编号中的代码行

如何使用Android片段管理器传递变量[重复]

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

十条实用的jQuery代码片段