Jika saya memahami pertanyaan Anda dengan benar, Anda mencari pelingkupan dinamis . Javascript tercakup secara leksikal, jadi untuk menangkap variabel, penutupan harus secara tekstual dalam cakupannya. Kalau tidak, ini tidak mungkin, tidak termasuk trik yang kurang lebih konyol seperti, misalnya:
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
Lihat juga Apakah mungkin untuk mencapai pelingkupan dinamis dalam JavaScript tanpa menggunakan eval? untuk diskusi dan contoh lebih lanjut.
Mengenai pertanyaan MongoDB Anda secara khusus, tidak mungkin dalam javascript murni untuk menyuntikkan variabel ke dalam ruang lingkup beberapa fungsi (sekali lagi, tanpa menggunakan eval). Tetapi pengurangan peta Mongo ditulis dalam C++, bukan dalam JS, dan dapat memanipulasi ruang lingkup dengan cara yang sewenang-wenang:
_scope->setFunction("emit", etc
Lihat sumber .
Untuk kelengkapan, berikut adalah contoh dengan 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 ]
)