Wir wissen, dass die Deklaration von Variablen gefördert wird:
var a = 1;
//上面一行相当于下面这样:
var a;
a = 1;
Gleichzeitig werden auch Funktionsdeklarationen gefördert:
foo();
function foo(){};
//上面两行相当于下面这样:
var foo;
foo = function (){};
foo()
Wenn es also sowohl Variablen- als auch Funktionsdeklarationen gibt, wer wird dann an die Spitze kommen? Wie sortiere ich? Zum Beispiel:
var a = 1;
foo();
function foo(){};
Ist das so?
var a;
var foo;
a = 1;
foo = function(){};
foo();
Weil ich diesen Satz in „JAVASCRIPT You Don't Know“ gesehen habe und etwas verwirrt war:
Funktionsdeklarationen und Variablendeklarationen werden gefördert. Ein bemerkenswertes Detail ist jedoch, dass zuerst Funktionen und dann Variablen hochgestuft werden. Funktionsdeklarationen werden vor gewöhnlichen Variablen platziert.
Also wird es so sortiert:
var foo;
foo = function(){};
var a;
a = 1;
foo();
Finden Sie die Sortierregeln, danke!
这个“先提升的”说法其实有误解的,这个只是表象而已。规范里是不分先后的(对 V8 的实现有兴趣可以看这里)。
var
的提升是声明跟赋值分开,function
提升则是整个提升,所以就会变成这样
所以就有了函数先提升的效果。
首先,我们可以把它分为4块内容
我们想知道提升后排序是什么形式?
目前已知条件是,变量声明会提升到变量赋值之前,所以我们可以先将变量声明放到前两位,暂时不管其内部顺序:
接下来我们来分别确定声明和赋值模块的内部排序。
为了进行实验,我们对foo函数进行扩充,所以现在的排序为:
先不要管为什么这么改,我们继续实验,实验过程中会理解。
为了便于理解,实验分两次进行。
首先:我们对变量声明模块进行实验。
然后:我们对变量赋值模块进行实验。
下面来进行实验:
根据实验结果,我们最后得出的排序结果是: