; (function ($) { ……}(jQuery)); jquery 程序这样开头,这样结尾,什么意思? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liushan
V2EX    jQuery

; (function ($) { ……}(jQuery)); jquery 程序这样开头,这样结尾,什么意思?

  •  
  •   liushan 2016 年 3 月 3 日 5362 次点击
    这是一个创建于 3667 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ; (function ($) { ……}(jQuery)); jquery 程序这样开头,这样结尾,什么意思?
    为什么不是这样?
    $(document).ready(fuction(e) {

    });

    18 条回复    2016-03-03 13:48:46 +08:00
    shunia
        1
    shunia  
       2016 年 3 月 3 日
    怕有人瞎搞,在运行过程中,把$换了。用方法包一下,可以尽量保证方法体里的$都是 jQuery 。
    所以就是:把不可控尽量变得可控。
    plqws
        2
    plqws  
       2016 年 3 月 3 日
    前者是一个纯粹的自执行函数,后者只是一个 DOM 渲染完毕的回调
    hansnow
        3
    hansnow  
       2016 年 3 月 3 日
    document ready 的话,可以看官方文档
    https://learn.jquery.com/using-jquery-core/document-ready/

    // Shorthand for $( document ).ready()
    $(function() {
    console.log( "ready!" );
    });

    为啥这样开头和结尾不知道
    jugelizi
        4
    jugelizi  
       2016 年 3 月 3 日
    Javascript 库使用 $ 作为函数或变量名,在 jQuery 中,$ 仅仅是 jQuery 的别名。
    yuankui
        6
    yuankui  
       2016 年 3 月 3 日
    搭车问下

    function() {
    //do somthing
    }()

    这样做是什么意义?
    dangyuluo
        7
    dangyuluo  
       2016 年 3 月 3 日
    @yuankui 按我的理解,是不让局部变量污染全局变量。
    demo
        8
    demo  
       2016 年 3 月 3 日
    简单说就是全局命名空间污染与 IIFE (Immediately-Invoked Function Expression ,立即执行的函数表达式),可以看: http://suqing.iteye.com/blog/1981591/
    codegeek
        9
    codegeek  
       2016 年 3 月 3 日   4
    1.最前面的分号是为了避免文件合并时出现错误,因为有的代码风格结尾不喜欢用分号;
    2.把代码放在一个匿名的立即执行函数闭包里,避免全局变量污染;
    3.传 jQuery 而不是别民,是为了确保传入的是 jQuery,毕竟还有其他的库也是用$。
    mmzer
        10
    mmzer  
       2016 年 3 月 3 日
    @codegeek 此楼正解!
    sciooga
        11
    sciooga  
       2016 年 3 月 3 日
    @yuankui
    你是不是写错了?应该是这样吧

    (function() {
    //do something
    })()

    同样是为了避免全局变量污染,这种自执行的函数有好几种写法。
    1. 楼主说的 (function(){ /* code */ }()) 这种最常见了。
    2. 我认为你想表达的 (function(){ /* code */ })()
    3. 运算符(! + ~ -)开头的 !function(){ /* code */ }()

    最后如果你没有写错那我觉得你那样写并没有什么特别的意义。
    jsonline
        12
    jsonline  
       2016 年 3 月 3 日 via Android
    归根结底,是因为 JS 只有函数作用域,没有块级作用域。
    v1024
        13
    v1024  
       2016 年 3 月 3 日
    ; (function ($) {

    }(jQuery));

    1. 开头的; 是为了防止与其他代码合并时的错误
    2. 用(function(){})(); 包装,保证内部变量不污染全局
    3. $ 和 jQuery ,是为了保证 $指代 jQuery ,因为有可能$ 被别人覆盖掉
    lwbjing
        14
    lwbjing  
       2016 年 3 月 3 日
    嗯。上面都说了。。
    br00k
        15
    br00k  
       2016 年 3 月 3 日
    jQuery(function ($) {})
    yuankui
        16
    yuankui  
       2016 年 3 月 3 日
    @sciooga 嗯,写错了,会意即可.
    juxingzhutou
        17
    juxingzhutou  
       2016 年 3 月 3 日
    我觉得可以把这个理解为一个语句块,类似 C 风格的
    ```
    {
    $ = jQuery;

    //使用 jQuery 的代码
    }
    ```
    vincenttone
        18
    vincenttone  
       2016 年 3 月 3 日
    (function ($) { ……}(jQuery));

    我们分解一下:

    var xxx = function ($) {.......};
    xxx(jQuery);

    这里只是一口气写成了(function ($) { ……}(jQuery));

    所以这里定义了一个匿名函数并调用了它,也不用声明 xxx 这个变量了。

    那为什么不这样写呢?:

    var $ = jQuery;
    ........

    很明显怕有污染,假设我写了一段代码:

    var $ = 1;

    var $ = jQuery;
    ........

    $++;

    这样会死。。。吧?

    那我们这么写:

    var $ = 1;

    var xxx = function ($) {.......};
    xxx(jQuery);

    $++;

    或者干脆:

    var $ = 1;
    (function ($) { ……}(jQuery));
    $++;

    就应该没事了。

    ps.我日常不写 js ,规范神马的不知道, so ,规范问题就不要指出了。。。语法或者内容有问题欢迎。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     958 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 20:49 PVG 04:49 LAX 13:49 JFK 16:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86