首页  >  问答  >  正文

javascript 函数声明提升,函数体是否会一起被提升?

javascript 函数声明提升,函数体是否会一起被提升?

如果不是,有如下反例:

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

demo(); //‘ok’

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

如果,有如下反例:

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

第一个例子说明函数体同样是被提升了的,如果按照这个思路来理解第二段代码,“重命名”函数会相互覆盖,后面的会覆盖前面的,所以,console.log(func)会输出‘function func() {console.log('22');};’ 这个字符串,但是实际并非如此。

因此产生了三个疑问:

  1. 请问要如何理解“变量提升,函数优先”呢?

  2. 函数体是不是同样提升?

  3. 第二段代码的运行结果如何解释?

PHP中文网PHP中文网2730 天前689

全部回复(10)我来回复

  • PHPz

    PHPz2017-05-19 10:45:15

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

    回复
    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
    
    

    回复
    0
  • 天蓬老师

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

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

    回复
    0
  • 某草草

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

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

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

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

    回复
    0
  • ringa_lee

    ringa_lee2017-05-19 10:45:15

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

    回复
    0
  • PHP中文网

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

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

    回复
    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限制了 这样的变量的提升,就出现了 你代码的情况!~!~

    回复
    0
  • 仅有的幸福

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

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

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

    回复
    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');
    };

    }

    回复
    0
  • phpcn_u1582

    phpcn_u15822017-05-19 10:45:15

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

    回复
    0
  • 取消回复