在jsp中看到这样一段程序
<script type="text/javascript">
(
function () 
{
var source = [
    {
     url: "",
     src: "images/topbg1.jpg"
    },
    {
        url: "",
        src: "images/topbg2.jpg"
    },
    {
     url: "",
        src: "images/topbg3.jpg"
    },
    {
     url: "",
     src: "images/topbg4.jpg"
    },
    {
     url: "",
     src: "images/topbg5.jpg"
    }
    ];
    $.each(source,function(i){})
    .......
}
)();</script>
我想问下一开始的"("号和结尾的括号有什么用?我试过把括号去掉这段代码就不起作用了。还有没有函数名的函数和其他函数有什么区别?

解决方案 »

  1.   

    1. 什么是自执行的匿名函数?
      它是指形如这样的函数: (function {// code})();  2. 疑问
      为什么(function {// code})();可以被执行, 而function {// code}();却会报错?  3. 分析
      (1). 首先, 要清楚两者的区别:
      (function {// code})是表达式, function {// code}是函数声明.
      (2). 其次, js"预编译"的特点:
      js在"预编译"阶段, 会解释函数声明, 但却会忽略表式.
      (3). 当js执行到function() {//code}();时, 由于function() {//code}在"预编译"阶段已经被解释过, js会跳过function(){//code}, 试图去执行();, 故会报错;
      当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行.详细参看 http://topic.csdn.net/u/20101214/11/c8942086-1cac-4adf-a548-c59175e83ae2.html
      

  2.   

    大道理不好说,说了你还可能晕乎乎的,举例吧
      var count = 5;
      outputNumbers(count);
    这里初始化了变量count,将其设置为5.当然,这里的变量是没有必要的,因为可以把值直接传给函数。为了让代码更简洁,我们在调用函数时用5来代替变量count,如下:
      outputNumbers(5)
    再看:
      var someFunction = function(){
          //这里是块级作用域
      };
      someFunction()
    这个例子先定义了一个函数,然后立即调用它。定义函数的方式是创建一个匿名函数,并把匿名函数赋值给变量someFunction。而调用函数的方式是在函数名称后面添加一面圆括号,即someFunction()。通过前面的例子我们知道,可以用实际的值来取代变量count,那么这里也可以用函数实际的值来直接取代函数名,即:
      function(){
          //这里是块级作用域
      }();
    但是,这样会导致语法错误,因为javascript将function关键字当作一个函数声明的开始,而函数声明后面不能跟圆括号,然而,函数表达式的后面可以跟圆括号,这上面这段代码正是匿名函数的表达式,所以给它加对圆括号就可以了,如下:
      (function(){
         //这里是块级作用域
        })();
    到此为止,你的问题就搞定了我前段时间也刚刚学到这里,就给你分享了!
    附: 去百度搜一搜“模仿块级作用域”和“匿名函数”,可以加深理解!
      

  3.   

    就像 a = x + y 和 a = (x) + (y) 的区别。
    因为运算符优先级的关系,这里要用()把整个 function 包围起来,表示里面是一个整体的function对象。
    (function(){...})();
    其实可以看作:
    var fun = function(){...};
    (fun)();
    当然这里的function已经用一个变量代替了,所以括号不再是必需的了,可以直接写成:
    var fun = function(){...};
    fun();
      

  4.   

    就像 a = x + y 和 a = (x) + (y) 的区别。
    因为运算符优先级的关系,这里要用()把整个 function 包围起来,表示里面是一个整体的function对象。
    (function(){...})();
    其实可以看作:
    var fun = function(){...};
    (fun)();
    当然这里的function已经用一个变量代替了,所以括号不再是必需的了,可以直接写成:
    var fun = function(){...};
    fun();