Ако съм разбрал въпроса ви правилно, вие търсите динамичен обхват . Javascript е с лексикален обхват, така че за да улови променлива, затварянето трябва да бъде текстово в нейния обхват. В противен случай това не е възможно, без да броим повече или по-малко глупави трикове като например:
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
Вижте също Възможно ли е да се постигне динамичен обхват в JavaScript, без да се прибягва до eval? за повече дискусии и примери.
Що се отнася конкретно до вашия MongoDB въпрос, не е възможно в чист javascript да се инжектира променлива в обхвата на някаква функция (отново, без да се прибягва до eval). Но map-reduce на Mongo е написан на C++, а не на JS, и може да манипулира обхвата по произволни начини:
_scope->setFunction("emit", etc
Вижте източника .
За пълнота, ето пример с 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 ]
)