Меня не интересует звонок или применяется для изменения ссылки this
. Только для моих собственных интересов я играю с идеей для другого, требующего техники для javascript, который бы сделал для некоторых более чистых определений, и цель заключалась в том, чтобы не передавать массивы или дублировать имена ссылочных модулей для моих определений.Изменение области видимости функции в 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's 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 (которые я не пытаюсь сражаться, просто интересуюсь областью!).
Хорошо, если вы не заинтересованы в вызове или подаете заявку и предпочитаете использовать противный eval, это ваш выбор, он будет работать, но вы никогда не получите от этого никакого результата, и если вы это сделаете, возможно, вы заслужили порку. Редактировать: просто шутка не воспринимает это плохо. Но после многих лет развития я часто говорю: «Это не потому, что мы можем это сделать» – elmuchacho
Если код в «someModules» сам был записан, чтобы иметь другие локальные переменные в области закрытия, ваш подход полностью их сломает. – Pointy
Без обид! Весь этот вопрос действительно предназначен для развлечений и экспериментов. Но применять и звонить не решают проблему. – andyortlieb