suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Wird der Funktionskörper gemeinsam hochgestuft, wenn die Javascript-Funktionsdeklaration hochgestuft wird?

Javascript-Funktionsdeklarationsförderung, wird der Funktionskörper gemeinsam gefördert?

Wenn nicht ist, gibt es das folgende Gegenbeispiel:

console.log(demo.toString()); //‘function demo() {console.log('ok')}’

demo(); //‘ok’

function demo() {
    console.log('ok')
}

Wenn ist, gibt es das folgende Gegenbeispiel:

console.log(func)  // undefined   ,如果直接执行func()函数抛出TypeError异常 
if(true){
    function func() {
        console.log('11');
    };
}else{
    function func() {
        console.log('22');
    };
}
func(); // 11

Das erste Beispiel zeigt, dass auch der Funktionskörper hochgestuft wird. Wenn Sie den zweiten Teil des Codes gemäß dieser Idee verstehen, überdecken sich die „Umbenennungs“-Funktionen gegenseitig und die späteren überdecken die vorherigen, also die Konsole. log(func) Die Zeichenfolge „function func() {console.log('22');};“ wird ausgegeben, aber das ist eigentlich nicht der Fall.

Drei Fragen stellen sich:

  1. Wie verstehen Sie „variable Förderung, Funktionspriorität“?

  2. Ist auch die Funktion des Körpers verbessert?

  3. Wie sind die Ergebnisse des zweiten Codeteils zu interpretieren?

PHP中文网PHP中文网2775 Tage vor730

Antworte allen(10)Ich werde antworten

  • PHPz

    PHPz2017-05-19 10:45:15

    相信你看完我写的文章就什么都明白了深入理解JavaScript执行上下文、函数堆栈、提升的概念

    Antwort
    0
  • 習慣沉默

    習慣沉默2017-05-19 10:45:15

    if代表着条件判断,编译的时候应该是不会去执行代码,只会检查语法词法分析。你可以尝试换浏览器,或者启用严格模式做一下测试,有可能会有意想不到的事情发生哦~

    1.变量提升,函数优先,就是 var a = 1;function fun(){};中var a;和function fun(){}会提升上去,提升到作用域的顶层。
    2.同样提升了。函数表达式不会,因为他是 var fun = function(){};这种,只会提升var fun;
    3.第二段,其实可以用下面的方法解释

    var func;
    console.log(func)
    if(true){
        func=function func() {
            console.log('11');
        };
    }else{
        func=function func() {
            console.log('22');
        };
    }
    func(); // 11
    
    

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-05-19 10:45:15

    详细介绍 见 MDN http://kangax.github.io/nfe/#...

    Antwort
    0
  • 某草草

    某草草2017-05-19 10:45:15

    在非严格模式下,放在if语句内部的函数声明是否会提升在各个内核的实现都不同。

    结论是,函数会提升,但是在if语句内部时要看各个内核的实现。

    严格模式禁止了不在脚本或者函数层面上的函数声明

    Antwort
    0
  • ringa_lee

    ringa_lee2017-05-19 10:45:15

    可以参考一下:/q/10...

    Antwort
    0
  • PHP中文网

    PHP中文网2017-05-19 10:45:15

    函数和变量声明会被提升,函数提升优先于变量提升,要直接运行的代码不能被提升吧。第一个代码里直接都提升了。第二个代码你定义的函数是在if 语句结构里面,两个log 和if 在运行栈里面应该是按顺序执行,显然if 语句运行之前你的func是还没有声明的 。

    Antwort
    0
  • 怪我咯

    怪我咯2017-05-19 10:45:15

    es6 有一些块级作用域的规则,这个地方 如果你你用老版本的 node或者低版本的chrome 运行
    相当于以下代码

    function func() {
       console.log('22');
    };
    
    console.log(func);
    if(true){
    }else{
    }
    
    func(); // 22
    

    可是 高版本的 node和chrome限制了 这样的变量的提升,就出现了 你代码的情况!~!~

    Antwort
    0
  • 仅有的幸福

    仅有的幸福2017-05-19 10:45:15

    因为JavaScript是一种函数级作用域(function-level scope
    所以if中并没有独立维护一个scope

    英文解释:
    javascript-variable-scope-and-hoisting-explained
    中文解释:Javascript作用域和变量提升

    Antwort
    0
  • PHP中文网

    PHP中文网2017-05-19 10:45:15

    一般不建议在条件判断语句中书写函数声明。
    这在ECMAScript中属于无效语法,javascript引擎会尝试修正错误,将其转换为正常合理的状态。然后这种修正的做法在不同的浏览器是不一样的。建议用函数表达式:
    var func;
    if(true){

    func=function {
        console.log('11');
    };

    }else{

    func=function {
        console.log('22');
    };

    }

    Antwort
    0
  • phpcn_u1582

    phpcn_u15822017-05-19 10:45:15

    http://blog.csdn.net/qq673318...
    链接有解释
    ————搬运工

    Antwort
    0
  • StornierenAntwort