美文网首页
函数声明与函数表达式的区别

函数声明与函数表达式的区别

作者: 前端阿良古 | 来源:发表于2018-10-03 01:00 被阅读0次

    函数声明:

    hello();
    function hello(){
      console.log('这是函数声明!');
    }
    

    函数表达式:

    hello(); // 这里会报错 Uncaught ReferenceError: hello is not defined
    const hello = function(){
      console.log('这里是函数表达式');
    }
    

    原因:解析器会率先读取函数声明,并使其在任何地方都可以使用;至于函数表达式,则必须等到解释器执行到它所在的代码行才会被真正解释执行。(其实就是解析器会先声明变量再等执行到所在代码行才初始化)

    可以同时使用函数表达式和函数声明,称之为具名函数表达式(Namedfunctionexpression,NFE),这种写法其实没啥用,还容易造成误会。要注意的是:这种语法在Safari中会导致错误

    const hello = function hello(){
      console.log('同时使用');
    }
    hello(); // 同时使用
    

    上面的代码看似没啥问题(就是没什么用而已),但是看看下面这个

    const fn = function hello() {
      hello = 1;
      console.log(hello);
    }
    hello(); // 这里会报错:Uncaught ReferenceError: hello is not defined
    fn(); // 这里输出函数本身ƒ hello() {hello = 1;console.log(hello);}
    

    这是因为具名函数表达式有两个特性:

    • 具名函数表达式的函数标识符只能在函数体内被访问,函数体外不能被访问
    • 具名函数表达式的函数标识符是只读的,不能被赋值

    总结:

    • 除此之外,函数声明和函数表达式是恒等的
    • 推荐使用函数表达式,因为js规范推荐先声明后使用

    相关文章

      网友评论

          本文标题:函数声明与函数表达式的区别

          本文链接:https://www.haomeiwen.com/subject/ezfzoftx.html