js匿名函数的一个问题

第一个问题:

        <script>
            function(){
                alert("ssss");
            }
        </script>

为什么会提示:Uncaught SyntaxError: Unexpected token (

第二个问题:

        <script>
            (function(){
                alert("ssss");
            })
        </script>

这为什么不提示错误,但没结果?

第三个问题:

<script>
            (function(){
                alert("ssss");
            })()
        </script>

这为什么对?

阅读 4.6k
9 个回答

第一个是函数定义语句,需要有函数名称

function fName() {}

噫,发现第二个是执行了的,第三个不是……你改了题目吗?那我改答案……
又改……那我再改……

第二三个是函数表达式(也有称为匿名函数),不需要有函数名称

第二个没效果是因为定义了没执行,所以没有明显的效果。

第三个一般称为立即执行的函数表达式,简称 IIFE,因为执行了,所以有效果。注意有一对小括号里是函数表达式,返回一个函数,对函数进行 () 运算就是执行函数,所以这里不光是定义,还执行了。

匿名函数应该是这样

(function(){
       alert("ssss");
  })()

你这是函数字面量格式,只能

function aaa(){//函数声明+函数名+参数+函数体,否则就报错,语法错误

     alert("ssss");
}
  第二个和第三个的区别:
  第二个是匿名函数+调用(“()”),第三个是由“()”将表达式"function(){
   alert("ssss");

}"转换为表达式(就是一个表达式)

var foo = function(){
   alert("ssss");
}
foo();

整体看出来是主要探究匿名自调用函数

问题 1. 没指定函数名(常规函数)
问题 2. 声明一个匿名自调用函数, 同时调用
问题 3. 声明一个匿名自调用函数

ps: 匿名自调用函数主要是为了解决函数域问题, 防止污染全局变量.

(function (){alert("ssss");})

匿名函数的调用是在函数末尾加上();你没有调用函数怎么会执行,就没结果咯。先去看看函数的3种声明方式及调用吧

问题1:

语法错误。为什么会导致语法错误?试想你这样定义完如何调用这个方法?

问题2:

加完圆括号后,将声明语句变成了表达式语句,所以避免了触发语法错误。没有执行?因为这个表达式内部还是一个声明,并没有调用。

问题3:

参照问题2,后面的()立即执行了这个方法,所以成功了

就是这样

  • 问题1:函数表达式定义函数写法应该是var s = function(){ alert("ssss"); },但其实这个可以这么写var s = new function(){ alert("ssss"); }(不推荐这样写)。我发现一个问题要是在浏览器中写成这样new function(){ alert("ssss"); }也是可以的,不会报错,会立即执行。如果为函数声明则应该写成function fName(){ alert("ssss"); }。对于第一个问题是函数声明,函数声明必须要有标识符做为函数名称,所以会报错。


  • 问题2:括号(),一种用法是作为分组运算符对表达式求值,举个例子1 * ( 2 + 3 )这里的括号就是将表达式分组进行运算。问题2中用括号将代码function(){ alert("ssss"); }括住,只是对这个表达式求值,求值结果是function(){ alert("ssss"); },函数并没有执行。


  • 问题3:问题3在问题2的基础上,在最后又加了一个括号,这就是括号的另一种使用,用来执行函数。前一个括号的运算结果是:function(){ alert("ssss"); }一个函数,则执行这个函数,就会弹出ssss结果。


可以看一看知乎上的一个回答JavaScript 匿名函数有哪几种执行方式?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题