Om jag förstod din fråga rätt, letar du efter dynamisk omfattning . Javascript har en lexikalisk omfattning, så för att fånga en variabel måste stängningen vara textmässigt inom dess omfång. Annars är detta inte möjligt, utan att räkna med mer eller mindre fåniga knep som till exempel:
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
Se även Är det möjligt att uppnå dynamisk omfattning i JavaScript utan att använda eval? för mer diskussion och exempel.
När det gäller din MongoDB-fråga specifikt, är det inte möjligt i rent javascript att injicera en variabel i någon funktions räckvidd (igen, utan att tillgripa eval). Men Mongos map-reduce är skriven i C++, inte i JS, och kan manipulera omfattningen på godtyckliga sätt:
_scope->setFunction("emit", etc