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 内的 this 引用

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 回答