关于变量提升和函数提升
上篇文章中,有两段代码:
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
开始看着有点疑惑,后来理清楚后,记录下执行顺序:
- 等同于如下:
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
是不是又有点晕了!!!少年!!
分析一下:
一个执行上下文的声明周期分为两个阶段
- 创建阶段
下面这一坨只是针对创建阶段,明白了吧!
这是因为在进入执行上下文时,首先会处理函数声明,其次会处理变量声明,如果如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性,所以会打印函数,而不是 undefined。
- 执行阶段