在不传递的情况下使用给定函数范围内的变量

时间:2012-11-19 19:05:27

标签: javascript function scope local-variables

我想在给定'functionToRun'的范围内使用像'thisModule'这样的局部变量,而不将它们作为参数传递。

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

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

不幸的是,'thisModule'未在范围内定义。 有没有一种方便的方法将'thisModule'引入函数范围?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

functionToRunOnsetsu.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;
});