MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment écrire la fonction-y acceptant le paramètre-fct_x qui accède à var-a qui doit être défini dans la fonction-y ?

Si j'ai bien compris votre question, vous recherchez une une portée dynamique . Javascript a une portée lexicale, donc pour capturer une variable, la fermeture doit être textuellement dans sa portée. Sinon, ce n'est pas possible, sans compter les astuces plus ou moins bêtes comme par exemple :

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

Voir aussi Est-il possible d'obtenir une portée dynamique en JavaScript sans recourir à eval ? pour plus de discussion et d'exemples.

En ce qui concerne spécifiquement votre question MongoDB, il n'est pas possible en javascript pur d'injecter une variable dans la portée d'une fonction (encore une fois, sans recourir à eval). Mais le map-reduce de Mongo est écrit en C++, pas en JS, et peut manipuler la portée de manière arbitraire :

_scope->setFunction("emit", etc

Voir la source .

Pour être complet, voici un exemple avec 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 ]
)