3

元のコード:

'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ユーザーは常にキーワードを介してオブジェクトコンストラクターを呼び出すと思います

記録のために、私は私が間違っていることを知っています。間違っています。私は自分の思考の欠陥がどこにあるのか理解できないようで、いくつかのガイダンスが欲しいです。

4

3 に答える 3

4

あなたの問題は、GitJSがすぐに呼び出される関数のプライベート変数になったことです。関数をプライベートスコープで非表示にすると同時に、公開することはできません。それらは相互に排他的な目標です。

したがって、ウィンドウを介してグローバル変数を明示的に設定する必要があります

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;
}());

OK、嘘をついた。グローバル変数に依存せずにJavascriptモジュールを作成できますが、これは通常、別のモジュール作成規則を使用したり、モジュールライブラリを使用したりすることを意味します。これに興味がある場合は、http://requirejs.org/をチェックすることを強くお勧めします。

于 2012-06-29T03:00:06.003 に答える
2

@missingnoは正しいですが、 RequireJSまたは同等の ローダーを使用することからほんの一歩であることを付け加えなければなりません。あなたはグローバル変数に嫌気がさしているのは正しいです。依存関係が定義された非同期モジュール内ですべてのJavaScriptを実行することにコミットする場合は、GitJsコンストラクターをグローバル定義関数に戻すだけで、GitJSモジュールを必要とするものすべてに要求できます。

// using the global define function provided by an AMD loader
// assuming that jQuery has already been provided by the paths config
define(['jquery'],function($) {
    'use strict';
    var GitJS = function() { ... }
    return GitJS
});
于 2012-06-29T03:09:18.427 に答える
2

いくつかのガイダンスを与えることに関して、これが完全に明白に聞こえるかどうかはわかりませんが、次の方法があります。

  • use strictすべてのメソッドにプラグマを挿入しないでください
  • 連結時に他のソースに厳密モードを課さない
  • .prototype構文を使用する
  • グローバルvar gitJs変数は必要ありません
  • newユーザーがキーワードを介してオブジェクトコンストラクターを呼び出せるようにする

そこにそれがある:

/* Class constructor, public, globally available */
function GitJs(config) {
    'use strict'; /* You may want to drop this one */
    var defaults = {
        inheriting: false,
        clientId: undefined,
        accessToken: undefined,
        baseUrl: 'https://api.github.com',
        mode: 'read'
    };

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

/* IIFE to wrap the *main* strict pragma */
(function () {
    'use strict';

    GitJs.prototype.getCommandMethod = function (httpVerb) {
        /* ... */
    };

    GitJs.prototype.someOtherMethod = function (someParam) {
        /* ... */
    };

})();

...

/* some other block */
... {
    var gitjs = new GitJs();
};

これは部分的に質問に答えますか?

于 2012-08-25T01:03:16.357 に答える