Als ik je vraag goed heb begrepen, ben je op zoek naar dynamische scoping . Javascript heeft een lexicaal bereik, dus om een variabele vast te leggen, moet de afsluiting tekstueel binnen het bereik vallen. Anders is dit niet mogelijk, afgezien van meer of minder domme trucs zoals bijvoorbeeld:
function makeClosure(context) {
return function() {
return context("a") + 1;
};
}
function y(evalThis) {
var a = 2;
if(evalThis)
return eval(evalThis);
return makeClosure(y);
}
closure = y();
document.write(closure()) // 3
Zie ook Is het mogelijk om dynamische scoping in JavaScript te bereiken zonder toevlucht te nemen tot eval? voor meer discussie en voorbeelden.
Wat specifiek uw MongoDB-vraag betreft, het is niet mogelijk om in pure javascript een variabele in het bereik van een functie te injecteren (nogmaals, zonder toevlucht te nemen tot eval). Maar Mongo's map-reduce is geschreven in C++, niet in JS, en kan het bereik op willekeurige manieren manipuleren:
_scope->setFunction("emit", etc
Zie de bron .
Voor de volledigheid is hier een voorbeeld met eval
:
function map(ary, fun) {
// define some locals
var LOCAL = 42;
// re-evaluate the function within the scope
eval("fun=" + fun);
// now fun sees our locals
return ary.map(fun);
}
document.write(
map([1,2,3], function(x) { return x * LOCAL }) // [ 42, 84, 126 ]
)