美文网首页前端你不进来看看?
函数声明?函数表达式?我该怎么选?!

函数声明?函数表达式?我该怎么选?!

作者: HarryPang | 来源:发表于2019-05-10 14:29 被阅读0次

    我们在日常开发中经常使用函数,聪明的你肯定已经用的炉火纯青了。function doStuff(){}()=> {}是我们整天输入的字符。但它们有何不同,为什么使用另一个呢?

    *注:我们这里用的例子都是JavaScript

    第一个不同:名称

    当你用一个名称创建函数时,这是一个函数声明。在函数表达式中可以省略该名称,使该函数“匿名”。

    函数声明:

    function doStuff() {};

    函数函数表达式:

    const doStuff = function() {}

    日常中我们经常使用ES6创建函数表达式

    const doStuff = ()={}

    第二个不同:提升

    提升是指函数和变量的提升,变量声明和函数声明提升至当前作用域的顶端,然后进行接下来的处理。

    函数声明会被提升但函数表达式不会。

    我们可以通过例子来加深理解:

    //函数声明
    doStuff();
    function doStuff() { console.log('haha')};
    

    结果:


    image

    看出来没有任何问题。

    看下一个例子

    //函数表达式
    doStuff();
    const doStuff = () => {console.log('haha')};
    
    image

    看,这就报错了。

    函数表达式实际解析的过程是这样的:

    const doStuff;
    doStuff();
    doStuff = () => {console.log('haha')};
    

    注:函数声明提升的优先级比变量提升高。

    使用函数表达式的情况:

    通过上面两个例子,看起来函数表达式在提升方面比函数表达式有用的多。但是在他们两个之间选择的时候应该如何抉择呢?

    调用函数表达式可以避免污染全局环境,因为你不知道你的程序有多少不同的函数,如果你使用函数表达式可能就会覆盖了别人的函数,采用函数表达式,就会避免这些问题。

    立即执行函数(IIFE)

    IIFE - 立即调用函数表达式 - 就是字面意思。在创建函数后立即调用函数,使用IIFE,如下所示:

    (function() => {})()
    //或者
    (() => {})()
    

    回调(callback)

    传递给另一个函数的函数通常在JavaScript中称为“回调”。,如下所示:

    function mapAction(item) {
      // do stuff to an item
    }
    array.map(mapAction)
    

    这里的问题是mapAction可用于整个应用程序- 其实没有必要。如果该回调是一个函数表达式,它在函数外就不可用了:

    array.map(item => { //do stuff to an item })
    //或者
    const mapAction = function(item) {
      // do stuff to an item
    }
    array.map(mapAction)
    

    虽然mapAction函数只有在他初始化之后才能使用

    总结

    简而言之,如果要在全局范围内创建函数并在整个代码中使用它,请使用函数声明。

    使用函数表达式来限制函数的可用位置,保持全局环境的整洁干净。
    ————————————————————————————————————————————————

    放学别走!长按二维码关注 【技术人生路】,无偿免费获取前端学习进阶资料,培训实战视频,就业指导等众多福利哦。我相信我们都是爱学习爱进步的呀!

    image

    相关文章

      网友评论

        本文标题:函数声明?函数表达式?我该怎么选?!

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