V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liushan
V2EX  ›  jQuery

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

  •  
  •   liushan · 2016-03-03 09:30:05 +08:00 · 4795 次点击
    这是一个创建于 3187 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    });

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

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

    为啥这样开头和结尾不知道
    jugelizi
        4
    jugelizi  
       2016-03-03 09:43:14 +08:00
    JavaScript 库使用 $ 作为函数或变量名,在 jQuery 中,$ 仅仅是 jQuery 的别名。
    yuankui
        6
    yuankui  
       2016-03-03 09:47:56 +08:00
    搭车问下

    function() {
    //do somthing
    }()

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

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

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

    最后如果你没有写错那我觉得你那样写并没有什么特别的意义。
    jsonline
        12
    jsonline  
       2016-03-03 11:05:25 +08:00 via Android
    归根结底,是因为 JS 只有函数作用域,没有块级作用域。
    v1024
        13
    v1024  
       2016-03-03 11:14:55 +08:00
    ; (function ($) {

    }(jQuery));

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

    //使用 jQuery 的代码
    }
    ```
    vincenttone
        18
    vincenttone  
       2016-03-03 13:48:46 +08:00
    (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   ·   实用小工具   ·   1203 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:23 · PVG 02:23 · LAX 10:23 · JFK 13:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.