suchen

Heim  >  Fragen und Antworten  >  Hauptteil

javascript - Funktionsdeklaration und deklarierte Variable existieren gleichzeitig. Welche Regeln gelten für die Heraufstufung?

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!

高洛峰高洛峰2808 Tage vor614

Antworte allen(3)Ich werde antworten

  • 仅有的幸福

    仅有的幸福2017-05-18 10:57:55

    这个“先提升的”说法其实有误解的,这个只是表象而已。规范里是不分先后的(对 V8 的实现有兴趣可以看这里)。

    var 的提升是声明跟赋值分开,function 提升则是整个提升,所以

    var a = 1;
    a();
    function a(){};

    就会变成这样

    var a;
    function a(){};
    a = 1;
    a();

    所以就有了函数先提升的效果。

    Antwort
    0
  • 巴扎黑

    巴扎黑2017-05-18 10:57:55

    首先,我们可以把它分为4块内容

    var a ;
    a =1;
    foo();
    function foo();
    

    我们想知道提升后排序是什么形式?
    目前已知条件是,变量声明会提升到变量赋值之前,所以我们可以先将变量声明放到前两位,暂时不管其内部顺序:

    var a ;
    function foo(){};
    a=1;
    foo();
    

    接下来我们来分别确定声明和赋值模块的内部排序。
    为了进行实验,我们对foo函数进行扩充,所以现在的排序为:

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

    先不要管为什么这么改,我们继续实验,实验过程中会理解。
    为了便于理解,实验分两次进行。
    首先:我们对变量声明模块进行实验。

    var a=1;
    console.log(foo);//若输出为function foo(){}则证明函数声明位于变量声明之前;若为undefined,说明相反。
    foo();
    function foo(){console.log(a+1)};
    

    然后:我们对变量赋值模块进行实验。

    var a=1;
    foo();//若输出为undefined1,则证明foo()在a=1之前;若输出为2,则说明a=1在foo()之前。
    function foo(){console.log(a+1)};
    

    下面来进行实验:

    var a=1;
    console.log(foo);//若输出为function foo(){}则证明函数声明位于变量声明之前;若为undefined,说明相反。
    foo();
    function foo(){console.log(a+1)};
    
    VM1099:2 function foo(){console.log(a+1)}
    VM1099:4 2
    

    根据实验结果,我们最后得出的排序结果是:

    function foo(){};
    var a;
    a=1;
    foo();
    

    Antwort
    0
  • 黄舟

    黄舟2017-05-18 10:57:55

    var a = 1;
    foo();
    function foo(){};
    提升之后
    function foo(){};
    var a;
    a = 1;
    foo();
    
    给你举个更明显的例子
    console.log(1, foo, typeof foo);
    var foo = "变量";
    console.log(2, foo, typeof foo);
    function foo(){
        console.log("函数声明");
    }
    console.log(3, foo, typeof foo);
    =》
    function foo(){
        console.log("函数声明");
    }
    var foo;
    console.log(1, foo, typeof foo);
    foo = "变量";
    console.log(2, foo, typeof foo);
    console.log(3, foo, typeof foo);
    输出为:
    1 function foo(){
        console.log("函数声明");
    } "function"
    2 "变量" "string"
    3 "变量" "string"

    Antwort
    0
  • StornierenAntwort