js深入系列阅读笔记

192 阅读2分钟

关于变量提升和函数提升

JavaScript深入之执行上下文栈

上篇文章中,有两段代码:

var foo = function () {

    console.log('foo1');

}
foo();  // foo1

var foo = function () {

    console.log('foo2');

}
foo(); // foo2
function foo() {
    console.log('foo1');
}
foo();  // foo2
function foo() {
    console.log('foo2');
}
foo(); // foo2

开始看着有点疑惑,后来理清楚后,记录下执行顺序:

  1. 等同于如下:
var foo;

foo = function () {
    console.log('foo1');
}
foo();  // foo1

foo = function () {
    console.log('foo2');
}
foo(); // foo2

2.等同于如下:

function foo() {
    console.log('foo1');
}
function foo() {
    console.log('foo2');
}

foo();  // foo2
foo(); // foo2

综上,函数提升和变量提升都会提升到顶部,再来分析就比较清楚了。

如果有的盆友还有一点点疑惑,可以看下下面这边文章:

深入理解变量声明提升和函数声明提升

ps:

看下如下例子,结果是啥?

console.log(foo);

function foo(){
    console.log("foo");
}

var foo = 1;

本来我的想法是先是处理处理函数声明,然后处理变量声明,如下:

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

所以觉得打出的应该是undefined,后来结果居然是打出了函数,看分析了解:

这是因为在进入执行上下文时,首先会处理函数声明,其次会处理变量声明,如果如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性,所以会打印函数,而不是 undefined。

是不是感觉理解了?

那看下下面这个结果是啥?

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

执行结果为:1

是不是又有点晕了!!!少年!!

分析一下:

一个执行上下文的声明周期分为两个阶段

  1. 创建阶段

下面这一坨只是针对创建阶段,明白了吧!

这是因为在进入执行上下文时,首先会处理函数声明,其次会处理变量声明,如果如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性,所以会打印函数,而不是 undefined。

  1. 执行阶段