Nếu tôi hiểu đúng câu hỏi của bạn, bạn đang tìm kiếm phạm vi động . Javascript có phạm vi từ vựng, vì vậy để nắm bắt một biến, bao đóng phải ở dạng văn bản trong phạm vi của nó. Nếu không, điều này là không thể, không tính nhiều hơn hoặc ít hơn các thủ thuật ngớ ngẩn như:
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
Xem thêm Có thể đạt được phạm vi động trong JavaScript mà không cần dùng đến eval không? để có thêm thảo luận và ví dụ.
Đối với câu hỏi MongoDB của bạn cụ thể, trong javascript thuần không thể đưa một biến vào phạm vi của một số hàm (một lần nữa, mà không cần dùng tới eval). Nhưng map-Reduce của Mongo được viết bằng C ++, không phải bằng JS và có thể thao tác phạm vi theo những cách tùy ý:
_scope->setFunction("emit", etc
Xem nguồn .
Để hoàn thiện, đây là một ví dụ với 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 ]
)