Jeśli dobrze zrozumiałem Twoje pytanie, szukasz dynamicznego określania zakresu . JavaScript jest objęty zakresem leksykalnym, więc aby przechwycić zmienną, zamknięcie musi znajdować się w jego zakresie tekstowym. W przeciwnym razie nie jest to możliwe, nie licząc mniej lub bardziej głupich sztuczek, takich jak na przykład:
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
Zobacz także Czy możliwe jest osiągnięcie dynamicznego określania zakresu w JavaScript bez uciekania się do eval? więcej dyskusji i przykładów.
Jeśli chodzi konkretnie o pytanie MongoDB, w czystym javascript nie jest możliwe wstrzyknięcie zmiennej do zakresu jakiejś funkcji (znowu, bez uciekania się do eval). Ale map-reduce Mongo jest napisany w C++, a nie w JS, i może manipulować zasięgiem w dowolny sposób:
_scope->setFunction("emit", etc
Zobacz źródło .
Dla kompletności, oto przykład z 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 ]
)