Wenn ich Ihre Frage richtig verstanden habe, suchen Sie nach Dynamic Scoping . Javascript hat einen lexikalischen Geltungsbereich. Um also eine Variable zu erfassen, muss sich die Schließung textuell innerhalb ihres Geltungsbereichs befinden. Anders ist das nicht möglich, mal abgesehen von mehr oder weniger dummen Tricks wie zum Beispiel:
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
Siehe auch Ist es möglich, dynamisches Scoping in JavaScript zu erreichen, ohne auf eval zurückzugreifen? für weitere Diskussionen und Beispiele.
Was Ihre MongoDB-Frage betrifft, ist es in reinem Javascript nicht möglich, eine Variable in den Bereich einer Funktion einzufügen (wiederum ohne auf eval zurückzugreifen). Aber Mongos Map-Reduce ist in C++ geschrieben, nicht in JS, und kann den Geltungsbereich auf beliebige Weise manipulieren:
_scope->setFunction("emit", etc
Siehe Quelle .
Der Vollständigkeit halber hier ein Beispiel mit 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 ]
)