Javascript 在给定函数的范围内使用变量而不传递
我想在给定的“functionToRun”范围内使用像“thisModule”这样的局部变量,而不将它们作为参数传递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
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
的属性。或者,使用我刚才添加到答案中的另一个选项。