js中()的作用

问题描述

a = (function foo1(){})
function foo2(){}

为什么执行完后,输入foo1是undefined,()的作用是立即执行,难道foo1是声明在局部作用域

阅读 370
评论 2019-03-24 提问
    4 个回答
    1. 首先,()操作符有两种用法,一是作为圆括号运算符,提升括号内表达式的优先级;二是作为函数调用操作符,用于执行在()操作符之前指向的函数名
    2. 其次,函数有函数声明和函数表达式两种声明形式,前者形如:

      function name([param,[, param,[..., param]]]) {
         [statements]
      }

      而函数表达式则是:

      let function_expression = function [name]([param1[, param2[, ..., paramN]]]) {
         statements
      };

      在函数表达式中,前边的 function_expression 如果存在,这就是个具名函数表达式;而反之则是匿名函数表达式。表达式里的 name 加的是方括号,表示可选:因为这个函数声明是被“禁锢”在 function_expression 变量里的,换句话说,它可以用function_expression()这种形式来调用(所以有没有名字其实无所谓了,因为函数名外部不可见)。

    3. 再说匿名函数表达式。
      匿名函数表达式,形如:

      function ([param,[, param,[..., param]]]) {
         [statements]
      }

      说白了就是函数声明不留名。做好事不留名可以,做函数不留名,...那怎么调动?所以这种形式单独存在的话,不合法。所以要怎么办?这时就出现了 IIFE,也就是立即调用函数表达式/自执行函数表达式。它的根本思想很简单,先用圆括号操作符把表达式本体罩住,表示“我罩你”,再在末尾加个函数调用操作符,表示“放胆做”,这俩加一块,就是“立即执行”:

      (function ([param,[, param,[..., param]]]) {
         [statements]
      })()

      (当然还有几种其它形式的,但先学标准的吧)

    4. 这些 balabala 的都看下来,你的问题也应该能有个解释了。(另外结下稿费,谢谢......
    5. 参考资料:

    评论 赞赏 2019-03-25
      继林
      • 573

      () 不会规划作用域,这里的使用 () 是无意义的,等同于 a = function foo1(){}

      这是具名的函数声明形式,函数最终作为a的值,所以在全局作用域中是不存在 foo1 的。

      评论 赞赏 2019-03-24
        • 首先,你把第一行代码的()去掉也完全OK,最后的结果照样是undefined,这里面的括号仅起到增强可读性的作用
        • 其次,现在给你解释为什么得不到foo1

          • 第一行代码a = function foo1() {} 是一个赋值语句(assignment statement)
          • 第一行代码中的后半部分function foo1() {}是一个函数表达式(function expression),这里的function关键字的作用是在语句中定义函数,且该函数是以个以Function.prototype为原型的对象详见
          • 函数表达式中的函数名可以省略,要想获取foo1可以通过Function.prototype.name这个属性使用a.name获取
          • 而第二行代码function foo2(){}是一个函数定义(function declaration),又叫函数语句(function statement),这里的函数名不可省略,且会作为当前作用域的变量被提前(hoisting)
        评论 赞赏 2019-03-25

          function foo2(){}();//这个()才是立即执行.

          (function foo2(){});//这个()只是把代码包一下,可以不用。

          评论 赞赏 2019-03-25
            撰写回答

            登录后参与交流、获取后续更新提醒