liushan
V2EX  ›  jQuery

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

  •  
  •   liushan · Mar 3, 2016 · 5946 views
    This topic created in 3898 days ago, the information mentioned may be changed or developed.

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

    });

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

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

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

    function() {
    //do somthing
    }()

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

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

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

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

    }(jQuery));

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

    //使用 jQuery 的代码
    }
    ```
    vincenttone
    vincenttone
    Mar 3, 2016
    18
    (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 ,规范问题就不要指出了。。。语法或者内容有问题欢迎。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3406 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 66ms · UTC 10:31 · PVG 18:31 · LAX 02:31 · JFK 05:31
    ♥ Do have faith in what you're doing.