私があなたの質問を正しく理解した場合、あなたは動的スコープ を探しています。 。 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
evalに頼らずにJavaScriptで動的スコープを実現することは可能ですか? 詳細な説明と例については。
特にMongoDBの質問に関しては、純粋なJavaScriptでは、変数を関数のスコープに挿入することはできません(ここでも、evalを使用せずに)。ただし、Mongoのmap-reduceはJSではなくC ++で記述されており、スコープを任意の方法で操作できます。
_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 ]
)