javascript - IIFE(立即调用的函数表达式)中的 Object.Prototype 方法和 'Use Strict'

标签 javascript inheritance anonymous-function iife

原代码:

'use strict';
function GitJs(config) {
    var defaults = {
        inheriting: false,
        clientId: undefined,
        accessToken: undefined,
        baseUrl: 'https://api.github.com',
        mode: 'read'
    };

    this.config = $.extend(defaults, config);
}

/**
 * Gets the jQuery method that GitJs#generateApiRequest is going to use to send the ajax request.
 *
 * @param {string} httpVerb The HTTP verb that the request will use,
 * @return string
 */
GitJs.prototype.getCommandMethod = function (httpVerb) {
    var method = $.get;

    switch (httpVerb) {
    case 'GET':
        method = $.get;
        break;
    case 'POST':
        method = $.post;
        break;
    }
    return method;
};

...

新代码:

(function() {
'use strict';
    'use strict';
    function GitJs(config) {
        var defaults = {
            inheriting: false,
            clientId: undefined,
            accessToken: undefined,
            baseUrl: 'https://api.github.com',
            mode: 'read'
        };

        this.config = $.extend(defaults, config);
    }

    /**
     * Gets the jQuery method that GitJs#generateApiRequest is going to use to send the ajax request.
     *
     * @param {string} httpVerb The HTTP verb that the request will use,
     * @return string
     */
    GitJs.prototype.getCommandMethod = function (httpVerb) {
        var method = $.get;

        switch (httpVerb) {
        case 'GET':
            method = $.get;
            break;
        case 'POST':
            method = $.post;
            break;
        }
        return method;
    };

    ...
}());

就此代码而言,当我尝试时:

var gitjs = new GitJs();

我被告知 GitJs 未定义

我到底在想什么:

  • 我不想在每个方法中都使用 use strict
  • 如果我的代码被缩小并连接到另一个文件,我希望它能很好地发挥作用。
  • 我想使用 .prototype 语法以便于以后继承(以及代码清晰度)
  • 我不想制作全局 var gitJs 变量,因为它可能会被其他人的脚本覆盖。
  • 我假设用户将始终通过new 关键字调用对象构造函数

郑重声明,我知道我错了。大错特错。我似乎无法弄清楚我思维中的缺陷在哪里,我希望得到一些指导。

最佳答案

你的问题是 GitJS 现在是立即调用函数的私有(private)变量。您不能将您的功能隐藏在私有(private)范围内,同时使其公开可用。它们是相互排斥的目标。

因此,您需要通过窗口显式设置全局变量

var GitJS;
(function() {
    'use strict';
     GitJS = function(){ ... }
     ...
}());

或者从 IIFE 内部返回导出的函数。

var ExportedGitJS = (function(){ //using a different name just to be clear...
    'use strict';
    var GitJS = function(){ ... }
    ...
    return GitJS;
}());

好吧,我撒谎了。您可以创建 Javascript 模块而不必依赖全局变量,但这通常也意味着使用不同的模块创建约定和/或使用模块库。我强烈建议您查看 http://requirejs.org/如果您对此感兴趣。

关于javascript - IIFE(立即调用的函数表达式)中的 Object.Prototype 方法和 'Use Strict',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11255461/

相关文章:

javascript - 如何构建JS.Class

javascript - 在jquery中连续向右移动div

javascript - AngularJS ng-view 不加载模板文件内容

c# - 非静态字段、方法或属性需要对象引用 'System.Web.UI.Page.Server.get'

c++ - 派生对象之间的特殊交互(即多重分派(dispatch))

javascript - 使用这种 JavaScript 编码模式来定义构造函数有什么好处?

PHP 闭包给出了奇怪的性能行为

javascript - 使用 AJAX 将 javascript 变量传递给 PHP

c++ - 将派生类中指向成员函数的指针转换为指向抽象成员函数的指针

c# - LINQ查询错误中的匿名函数