Меня не интересует вызов или применяется для изменения ссылки this
. Только для моих собственных интересов я играю с идеей для другого, требует техники для javascript, которая сделала бы для некоторых более чистых определений, и цель заключалась в том, чтобы не передавать массивы или дублировать имена ссылочных модулей для моих определений.
У меня есть примерное решение (просто доказательство концепции), использующее toString и eval для функции, но мне интересно, есть ли более безопасный или более эффективный способ сделать это.
// Sample module libraries (would probably be in their own files)
someModules = {
testModule: {test: function(){console.log("test from someModule")}},
anotherModule: { doStuff: function(){console.log("Doin stuffs!");}}
};
sampleRequire = function() {
// Load the modules
for (var i=arguments.length-2; i>=0; --i){
// Create a local variable reference to the module
eval ('var '+arguments[i]+' = someModules.'+arguments[i].toString());
}
// Redefine the programmer function so that it has my local vars in its scope
eval("var fn = "+arguments[arguments.length-1]);
return fn;
}
// Main code...
sampleRequire( 'testModule', 'anotherModule',
function(){
testModule.test();
anotherModule.doStuff();
}
)();
Edit:
Pointy сделал отличную оценку, что это полностью разрушит масштаб основной функции, что часто бывает неприемлемым. В идеале я хотел бы видеть, что переменные модуля добавляются в область функций, не сбивая другие переменные с областью (за исключением имен модулей - программист должен знать, что нельзя использовать одно и то же имя для двух вещей). Я уверен, что это, вероятно, невозможно, но я все равно буду любить некоторые идеи.
Другая цель - сделать это гибко, не добавляя аргументы на модуль к основной функции. В противном случае мы вернемся к квадрату с стилями CommonJS (которые я не пытаюсь сражаться, просто интересуюсь областью!).