0

与えられた「functionToRun」のスコープで「thisModule」のようなローカル変数をパラメーターとして渡さずに使用したい。

Onsetsu.run = function (functionToRun) {
    var thisModule = Onsetsu.namespace(resolvedModule.moduleName);
    functionToRun();
};

Onsetsu.run(function() {
    /* thisModule should be visible here */
});

残念ながら、「thisModule」はスコープで定義されていません。'thisModule'を関数スコープに取り込む便利な方法はありますか?

4

2 に答える 2

1

thisModuleをfunctionToRun内のこの参照にアタッチできます

Onsetsu.run = function (functionToRun) {
    var thisModule = Onsetsu.namespace(resolvedModule.moduleName);
    functionToRun.apply(thisModule,[]);
};

したがって、関数内では、次のようにthisModuleを参照できます。

function myFunc(){
    console.log(this); // which will refer to thisModule
}
Onsetsu.run(myFunc);
于 2012-11-19T19:10:53.037 に答える
1

functionToRunおよびの最も近い共有スコープで変数を定義しますOnsetsu.run。内の変数を割り当てますOnsetsu.run

var thisModule;
Onsetsu.run = function (functionToRun) {
    thisModule = Onsetsu.namespace(resolvedModule.moduleName);
    functionToRun();
};

Onsetsu.run(function() {
    /* thisModule should be visible here */
});

実際のコードがそれよりも複雑であると仮定します。

(function(){
    var thisModule;
    var Onsetsu = (function(){
        var resolvedModule = { moduleName: "something" };
        return {
            run: function (functionToRun) {
                thisModule = Onsetsu.namespace(resolvedModule.moduleName);
                functionToRun();
            },
            namespace: function(moduleName){ ... }
        };
    })();
    Onsetsu.run(function() {
        /* thisModule should be visible here */
    });
})();

Onsetsuを変更できない(または変更したくない)ライブラリの場合は、運が悪いです。

編集:関数自体にプロパティを割り当てることもできます:

Onsetsu.run = function (functionToRun) {
    var thisModule = Onsetsu.namespace(resolvedModule.moduleName);
    functionToRun.module = thisModule;
    functionToRun();
};

functionToRunあなたは経由で内部からプロパティにアクセスすることができますarguments.callee

Onsetsu.run(function() {
    var module = arguments.callee.module;
});

または、関数に名前を付けることによって:

Onsetsu.run(function fn() {
    var module = fn.module;
});
于 2012-11-19T19:25:41.953 に答える