MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come scrivere function-y accettando parametro-fct_x che accede a var-a che deve essere definito in function-y?

Se ho capito correttamente la tua domanda, stai cercando ambito dinamico . Javascript ha un ambito lessicale, quindi per acquisire una variabile, la chiusura deve essere testualmente all'interno del suo ambito. Altrimenti, questo non è possibile, senza contare trucchi più o meno sciocchi come, ad esempio:

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

Vedi anche È possibile ottenere l'ambito dinamico in JavaScript senza ricorrere a eval? per ulteriori discussioni ed esempi.

Per quanto riguarda in particolare la tua domanda MongoDB, non è possibile in puro javascript iniettare una variabile nell'ambito di alcune funzioni (di nuovo, senza ricorrere a eval). Ma il map-reduce di Mongo è scritto in C++, non in JS, e può manipolare l'ambito in modi arbitrari:

_scope->setFunction("emit", etc

Consulta la fonte .

Per completezza, ecco un esempio 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 ]
)