suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Javascript – Funktionsdeklarations- und Variablendeklarationspriorität

  console.log(f);//function f(){return 1}
    function f(){
        return 1
    }
    var f=2;

Ich dachte vorher, dass, wenn eine Funktion und eine Variable denselben Namen haben, die Heraufstufung der Funktionsdeklaration die Heraufstufung der Variablendeklaration überschreibt, und dann habe ich den folgenden Code getestet

  function f(){
   return 1
}
var f=2;
    console.log(f);//2

Die Ausgabe von console.log(f) ist je nach Position unterschiedlich. Wer überschreibt wen oder gibt es einen anderen Grund?
Bitte bitten Sie den Meister um eine Erklärung

学习ing学习ing2800 Tage vor916

Antworte allen(7)Ich werde antworten

  • 黄舟

    黄舟2017-06-12 09:30:15

    第一段

     console.log(f);//function f(){return 1}
        function f(){
            return 1
        }
        var f=2;

    相当于=>

    var f;
    function f() {
      return 1
    }
    console.log(f); //function f(){return 1}
    f = 2;




    第二段

      function f(){
       return 1
    }
    var f=2;
        console.log(f);//2

    相当于=>

    var f;
    function f() {
      return 1
    }
    f = 2;
    console.log(f); //2

    参见
    https://www.zhihu.com/questio...

    Antwort
    0
  • 某草草

    某草草2017-06-12 09:30:15

    不在块中定义函数时, 先提升函数,再提升变量声明. 参考 ECMAScript 5, section 10.5.

    例子如下:

    function f(){}
    var f;
    console.log(f);
    
    var g;
    function g(){}
    console.log(g);
    

    以上输出为 function. 并不是 undefined.所以先提升函数,再提升变量声明.

    Antwort
    0
  • PHP中文网

    PHP中文网2017-06-12 09:30:15

    JS 解释器会首先提升 var 声明,注意是提升 var 声明语句而不是赋值语句
    然后,才会提升函数声明。因此,才会形成楼上说的情况

    对于第二个情况,感觉和 hoisting 没啥关系。虽然同样提升了 var f,但这里关键在于执行赋值 f = 2 之后才输出的啊。。所以,用来证明 JS 是一个弱类型语言倒是不错的选择= =

    可能我说的有歧义,LZ 还是去看下别人的解释吧

    Antwort
    0
  • 黄舟

    黄舟2017-06-12 09:30:15

    按ecma的标准,是先提升函数声明的;不过说真的,不管先提升的是谁,结果其实是一样的你知道吗

    Antwort
    0
  • 为情所困

    为情所困2017-06-12 09:30:15

    第一段代码是变量提升,var f=undefined,变量f指向了function;第二段代码按照JavaScript的执行顺序,把2赋值给了f。

    Antwort
    0
  • 漂亮男人

    漂亮男人2017-06-12 09:30:15

    js在执行时,会从上往下执行。

    console.log(f);//function f(){return 1}
        function f(){
            return 1
        }
        var f=2;

    这段代码中,函数声明function f和变量声明var f 一起提升,但是函数声明优先级会更高,
    所以代码变成了

    var f;
    function f() {
      return 1
    }
    console.log(f); 
    f = 2;

    f=2(属于赋值,位置不变只是变量声明提升了)

    第二段代码

    function f(){
       return 1
    }
    var f=2;
        console.log(f);//2

    你同样用如上方法理解
    被js引擎理解为

    function f(){
       return 1
    }
    var f;
    f=2;
    console.log(f);//2

    函数f被变量f覆盖,所以输出2

    Antwort
    0
  • 黄舟

    黄舟2017-06-12 09:30:15

    console.log(e());//error
    
    if(true){
        function e() {
            return 10;
        }
    }
    

    如ycloud所说 以上原因是“函数定义提升只提升到了if 的块作用域内”

    if(true){
    
        function e() {
            return 10;
        }
    }
    console.log(e());//10
    

    如果函数定义提升只提升到了if的块作用域内,那么以上又是什么原因呢?(chrome58测试) 为何外部又能访问if的块作用域内的函数

    Antwort
    0
  • StornierenAntwort