Javascript 在给定函数的范围内使用变量而不传递

Javascript 在给定函数的范围内使用变量而不传递,javascript,function,scope,local-variables,Javascript,Function,Scope,Local Variables,我想在给定的“functionToRun”范围内使用像“thisModule”这样的局部变量,而不将它们作为参数传递 Onsetsu.run = function (functionToRun) { var thisModule = Onsetsu.namespace(resolvedModule.moduleName); functionToRun(); }; Onsetsu.run(function() { /* thisModule should be visib

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

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

Onsetsu.run(function() {
    /* thisModule should be visible here */
});
遗憾的是,“thisModule”未在范围中定义。
是否有一种方便的方法将“thisModule”引入函数范围?

您可以将thisModule附加到函数运行中的this reference

Onsetsu.run = function (functionToRun) {
    var thisModule = Onsetsu.namespace(resolvedModule.moduleName);
    functionToRun.apply(thisModule,[]);
};
因此,在您的函数中,您可以这样引用此模块:

function myFunc(){
    console.log(this); // which will refer to thisModule
}
Onsetsu.run(myFunc);

函数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();
};
您可以通过
参数从
函数运行
中访问属性。被调用方

Onsetsu.run(function() {
    var module = arguments.callee.module;
});
或者通过给函数命名:

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

缺点是你只能有一个。如果您需要其他模块,您必须将它们包装在一个对象中。@thunderflower这是正确的,但这也是一个良好的开端,您始终可以使用apply方法的第二个参数来传递其他内容。我已经将此视为一个选项,但不满意使用this引用,因为我想稍后在保留局部变量的同时将函数应用于不同的上下文。@StefanLehmann您当前正在以匿名函数的形式调用函数,因此这是指窗口对象。方便的方法是将其作为参数传递。正如所说,将其作为参数传递将无法满足要求。将它们作为参数传递会冻结参数的顺序,这会导致访问给定变量的模块化程度和可维护性降低。@Stefan-我很困惑。函数根本没有传递任何参数,因此没有参数的顺序。您在谈论哪些参数?我只是说明了为什么我不想使用参数,所以这是一个“假设”场景。不幸的是,to代码片段甚至在单独的文件中(核心库和异步加载模块,使用
Onsetsu.run
函数执行)。@Stefan-那么最接近的共享作用域将是全局作用域。如果要避免名称空间污染,请将其公开为
Onsetsu
的属性。或者,使用我刚才添加到答案中的另一个选项。