Si entendí tu pregunta correctamente, estás buscando alcance dinámico . Javascript tiene un alcance léxico, por lo que para capturar una variable, el cierre debe estar textualmente dentro de su alcance. De lo contrario, esto no es posible, sin contar trucos más o menos tontos como, por ejemplo:
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
Consulte también ¿Es posible lograr un alcance dinámico en JavaScript sin recurrir a eval? para más discusión y ejemplos.
En cuanto a su pregunta de MongoDB específicamente, no es posible en javascript puro inyectar una variable en el alcance de alguna función (nuevamente, sin recurrir a eval). Pero map-reduce de Mongo está escrito en C++, no en JS, y puede manipular el ámbito de forma arbitraria:
_scope->setFunction("emit", etc
Consulte la fuente .
Para completar, aquí hay un ejemplo con 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 ]
)