Javascript立即调用函数表达式(IIFE)和函数作用域

时间:2014-07-31 04:18:48

标签: javascript jquery iife

请随时将tittle更新为更合适的。我不确定如何说出来。


因此,当我需要为网站编写jQuery时,我已经养成了一种习惯(不确定是好还是坏)。我只在快速而肮脏的工作中使用它,其中需要单个文件且几乎没有依赖性,而AMD,RequireJS和CommonJS都是过度的。它基于格雷格·弗兰科的this文章。

它确保一切安全且无冲突,并确实有助于提高可读性。不幸的是,虽然我发现它后,它成了我所有事情jQuery的模板,我从来没有费心去研究它的陷阱对性能的影响。

话虽如此,我想就此技术可能出现的任何问题得到一些反馈,特别是如果我应该使用它或其他技术。

当通过JSLint时,我总是会遇到以下错误:

'a' was used before it was defined.
         $('#a').on('click', a);

Unused 'a'.
    function a() {

我知道为什么错误存在以及它们意味着什么,但我希望有一个带有我的配置选项的传递JS文件,它可以工作......

/*jslint browser: false, couch: false, devel: false, node: false, rhino: false, passfail: false, ass: false, bitwise: false, closure: false, continue: false, debug: false, eqeq: false, evil: false, forin: false, newcap: false, nomen: false, plusplus: false, regexp: false, unparam: false, sloppy: false, stupid: false, sub: false, todo: false, vars: false, white: false, indent: 4 */
/*global window, document, location, jQuery*/

(function (appLoad) {
    "use strict";
    appLoad(window.jQuery, window, document);
}(function ($, window, document) {
    "use strict";

    $(function () {

        // These are executed when the document is ready

        $('#a').on('click', a);
        $('#b').on('click', b);
        $('#c').on('click', c);

    });

    // Logic that is not dependent on the document being ready is below here.
    // I typically place all my logic functions here for readability.

    function a() {
      ...
    }

    function b() {
      ...
    }

    function c() {
      ...
    }
}));

有没有更好的方法来做我说明的事情?

1 个答案:

答案 0 :(得分:1)

JSLint只抱怨您的代码如下所示:

$(function() {
    $('#a').on('click', a);
});

function a() {
    // ...
}

而不是:

function a() {
    // ...
}

$(function() {
    $('#a').on('click', a);
});

因此,如果你想摆脱那个警告,你可以移动这些功能。

那就是说,可能会牺牲清晰度,你可以重写

(function (appLoad) {
    "use strict";
    appLoad(window.jQuery, window, document);
}(function ($, window, document) {
    // ...
}));

作为

(function ($, window, document) {
    // ...
}(window.jQuery, window, document));

但这并不是JSLint所抱怨的。