<script type="text/javascript">
  (function(){
    var r, url;                   
    var s = location.href;
    url = /http:\/\/www.csdn.com.cn/i;          
    if(s.search(url)>=0){
      var head=document.getElementById("topHead");
      head.style.width="990px";
    }
  })()
</script>
上面那段代码具体功能我了解,不明白这种形式的用法和好处,function为什么用一个小括号给包着,最后一个括号做什么用的,假如括号后面有没结束,要不要带上引号。这种写法这 叫什么写法,回调么?望大家赐教。

解决方案 »

  1.   

    (function(){
        var r, url;                   
        var s = location.href;
        url = /http:\/\/www.csdn.com.cn/i;          
        if(s.search(url)>=0){
          var head=document.getElementById("topHead");
          head.style.width="990px";
        }
      })
    声明了一个匿名函数
    加个()执行它
      

  2.   

    就是不需要方法名,直接创建以后调用例如function a(){alert()} 
    a() //执行该方法function{return alert()}() //直接执行该方法
      

  3.   

    不过 function{return alert()}()//既然能这样。(function{return alert()})()//为什么还要这样.
      

  4.   

    不过
    function{return alert()}()//既然能这样。   并不能这样,你没写方法名 不对滴
    (function{return alert()})()//为什么还要这样.
      

  5.   

    补充一下
    就算你写了方法名也不能直接()  所以要加一个括号(function(){}) 这样就是一个表达式。就在后面加()执行了这种写法主要是为了避免变量污染 
      

  6.   

    这种方式叫函数的闭包(closure),可以让匿名函数立即被执行(最后面的那对括号就是让上面定义的匿名函数立即执行的秘密),这种闭包有以下几个优势或特点:
    1. 减少了全局变量的个数,可以有效减少命名冲突
       原因是包在里面的变量对于外面来说是不可见的,他们的作用域近局限在匿名函数的函数体内
    2. 这种方式可以保存闭包外面的变量的状态,这个特点还是举个例子比较易懂:function fn() {
        for(var i=0 ; i<2; i++) {
        //(function(){
            var backup = i;
            setTimeout(function() {
                alert(backup);
            }, 2000);
        //})();
        }
    }fn();上面代码的for循环一共两次,我们本来的目的是每隔两秒钟把每一次循环的索引(也就是i)输出,我们期待它应该输出:0和1,但是实际输出结果却是两次都是1
    使用了闭包之后,我们会把循环中每一次i值的状态都保存下来,如下代码所示:function fn() {
        for(var i=0 ; i<2; i++) {
        (function(){
            var backup = i;
            setTimeout(function() {
                alert(backup);
            }, 2000);
        })();
        }
    }fn();这次我们得到了正确的结果:0和1Enjoy!
      

  7.   

    function{return alert()}()//既然能这样。???
    这是错误的
      

  8.   

    I couldn't enjoy it!请讲讲为什么不用闭包时 结果 是 1 、1 ,用了闭包结果就是 0、1 吗?
      

  9.   

     I couldn't enjoy it!请讲讲为什么不用闭包时 结果 是 1 、1 ,用了闭包结果就是 0、1 吗?因为闭包引用的是父函数范围内的最终值
    精通JAVACRIPT里面提到过这个问题
      

  10.   

    闭包对父函数范围内变量的调用,是传址 refercence 而不是传值 value ,对吗?如果我的理解是正确的, 那么,这个问题就容易理解多了。我说到点子上了么?
      

  11.   

    请帮忙比较这两种写法的区别
    function f() {   
      var a = [];   
      var i;   
      for(i = 0; i < 3; i++) {   
        a[i] = (function(i){   
          return function(){   
            alert(i);   
            return i;   
          }   
        })();   
      }   
      return a;   
    }   
      
    var a = f();   
    a[0]();//undefined  
    a[1]();//undefined  
    a[2]();//undefined  
    ---------------------------
    function f() {   
      var a = [];   
      var i;   
      for(i = 0; i < 3; i++) {   
        a[i] = (function(x){   
          return function(){   
            alert(x);   
            return x;   
          }   
        })(i);   
      }   
      return a;   
    }   
      
    var a = f();   
    a[0]();//0 
    a[1]();//1
    [2]();//2  
      

  12.   

    回楼上:
    (function(i)){...}(i)想象成定义之后马上调用
    你看你第一个在后面调用的时候没有加入参数i导致函数内部调用的时候无值
    相当于function(){alert(i);}里面的i根本没有定义过,当然是undefined。
    而第二个虽说定义的时候用的是x,但是传进去的参数还是
    不知道这个说法对吗