js包中的代码:
(function( window, undefined ) {
...
})(window);
又如:
(function( $, undefined ) {
...
}(jQuery));
继续如:
(function( $, undefined ) {
...
})(jQuery);
我的问题是:
为什么可以在function(){...}外面加一个括号,前者function外的(window)是什么意思?
后者紧随function的(jQuery)是什么意思?它们都代表了什么?
为什么(window)是写在外面,而(jQuery)是写在function的同一个括号里?第三个的(jQuery)又是写在外面的,(window)和(jQuery)有什么区别?,求解啊,不懂啊。

解决方案 »

  1.   

    闭包问题,放在后面的括号的window,jquery可看做匿名函数的参数,
      

  2.   

    那这个来讲吧
    (function( $, undefined ) {
    ...
    }(jQuery));
    function( $, undefined ) {
    ...
    }:表示申明一个匿名函数
    function( $, undefined ) {
    ...
    }(jQuery)表示让申明的这个匿名函数立即执行。这个匿名函数需要两个参数,但在执行时只传入jQuery这一个参数也是可以的。
    再加一个小括号是表示是一个整体。
      

  3.   


    (function(){
       
    }) ();这样写定义并立即调用了一个匿名函数(function(undefined ){
        
    }) (window);这样写 undifined作为匿名函数的参数,window作为调用匿名函数运行的参数这样写就是把window对象作为匿名函数的参数,并立即执行(function(){
        
    }) (window);
      

  4.   

    (function( window, undefined ) {
    ...
    })(window);=function fun(w,u){
    ..
    }fun(window);
      

  5.   

    这样说比较容易理解:
    比如这个:
    (function( window, undefined ) {
    ...
    })(window);可以这样理解:
    function a(){//定义a函数
        alert(1);
    }
    也可以这样定义a函数
    var a=function(){
       alert(1);
    }
    a();//这里调用a函数既然a=function(){ alert(1);}
    那么就可以直接省去上面的定义直接写成:
    function(){alert(1)}(); 表示直接运行函数,如果前面定义里面有参数,后面的括号里面就需要填写参数
      

  6.   

    {}外面不能跟括号,所以前面加一个括号
    (function(){alert(1);})();
      

  7.   

    又学了点东西
    function( window, undefined )
    这两个参数是什么意思??
    尤其是undefined还有(function( $, undefined ){...})(jq); 最后()中jq只有一个参数有这么理解呢?
      

  8.   

    (function( window, undefined ) {
    //...
    })(window);这样写等价于function func ( window, undefined ) {
    // ...
    }
    func(window);第二种写法很有问题,第三种写法同理。
      

  9.   

    这样的话,fun有两个参数,却只传入一个,不会有问题吗?
      

  10.   

    没有传第二个参数,说明第二个参数没有赋值,在js中没有赋值的变量的值是undefined,这正是作者的意图,故意不传的,你看第二个形参的名字便知
      

  11.   

    给你个例子,你自己试一下:
    [code]
    var undefined = 1;
    alert(undefined);(function(window,undefined){
        alert(undefined);
    }(window));(function(window){
        alert(undefined);
    }(window));[/code]
      

  12.   


    var undefined = 1;
    alert(undefined);(function( window, undefined ) {
    alert(undefined);
    })(window);(function( window ) {
    alert(undefined);
    })(window);
      

  13.   

    (function( $, undefined ) {
    ...
    }(jQuery));

    (function( $, undefined ) {
    ...
    })(jQuery);
    两个有什么区别啊?
      

  14.   

    你把我的代码分别run一下啊。这样做的目的是为了避免原始的一些数据变量覆盖。在js中并不会对一些通用的数据类型(变量,如null,undefined等进行保护,你可以对其任意覆盖),这里就通过这种方式对闭包内的数据保护:
    (function( $, undefined ) {
    ...
    })(jQuery);
    这样的方式使得闭包内的undefined还是js原生的undefined
      

  15.   

    (function( $, undefined ) {
    ...
    })(jQuery);后者紧随function的(jQuery)是什么意思?它们都代表了什么?
    jQuery是写好的框架的名称,但是在这儿是一个新建好的jQuery对象,看他的jquery.1.1源码,或许能明白一些。
        var jQuery = function (a, c) {
            // If the context is global, return a new object
            if (window == this)
                return new jQuery(a, c);        // Make sure that a selection was provided
            a = a || document;        // HANDLE: $(function)
            // Shortcut for document ready
            // Safari reports typeof on DOM NodeLists as a function
            if (jQuery.isFunction(a) && !a.nodeType && a[0] == undefined)
                return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ](a);        // Handle HTML strings
            if (typeof a == "string") {
                var m = /^[^<]*(<.+>)[^>]*$/.exec(a);            a = m ?
                    // HANDLE: $(html) -> $(array)
                    jQuery.clean([ m[1] ]) :                // HANDLE: $(expr)
                    jQuery.find(a, c);
            }        return this.setArray(
                // HANDLE: $(array)
                a.constructor == Array && a ||                // HANDLE: $(arraylike)
                    // Watch for when an array-like object is passed as the selector
                    (a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray(a) ||                // HANDLE: $(*)
                    [ a ]);
        };
        // 主要看这段:if (window == this)
                return new jQuery(a, c);另外可以看看这个:
    http://www.jjquery.com/article-844-1.html
    这段文章对jquery一些犀利的用法做了一些说明。