Giải pháp là sự ràng buộc của các biến thông qua việc đóng.
Như một ví dụ cơ bản hơn, đây là một hàm ví dụ nhận và gọi một hàm gọi lại, cũng như một hàm gọi lại ví dụ:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
Điều này gọi lại cuộc gọi và cung cấp một đối số duy nhất. Bây giờ bạn muốn cung cấp một đối số bổ sung, vì vậy bạn kết thúc cuộc gọi lại trong bao đóng.
callbackReceiver(callback); // "Hello World", undefined
callbackReceiver(function(value) {
callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});
Hoặc, đơn giản hơn là sử dụng Hàm mũi tên ES6 :
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
Đối với ví dụ cụ thể của bạn, tôi chưa sử dụng .post
hàm trong jQuery, nhưng việc quét nhanh tài liệu cho thấy cuộc gọi lại phải là một con trỏ hàm có chữ ký sau:
function callBack(data, textStatus, jqXHR) {};
Do đó tôi nghĩ giải pháp như sau:
var doSomething = function(extraStuff) {
return function(data, textStatus, jqXHR) {
// do something with extraStuff
};
};
var clicked = function() {
var extraStuff = {
myParam1: 'foo',
myParam2: 'bar'
}; // an object / whatever extra params you wish to pass.
$.post("someurl.php", someData, doSomething(extraStuff), "json");
};
Chuyện gì đang xảy ra vậy?
Trong dòng cuối cùng, doSomething(extraStuff)
được gọi và kết quả của lời gọi đó là một con trỏ hàm .
Bởi vì extraStuff
được truyền dưới dạng đối số cho doSomething
nó nằm trong phạm vi của doSomething
hàm.
Khi extraStuff
được tham chiếu trong hàm bên trong ẩn danh được trả về của doSomething
nó bị ràng buộc bởi việc đóng với extraStuff
đối số của hàm ngoài . Điều này đúng ngay cả sau khi doSomething
đã trở lại.
Tôi đã không kiểm tra những điều trên, nhưng tôi đã viết mã rất giống nhau trong 24 giờ qua và nó hoạt động như tôi đã mô tả.
Tất nhiên, bạn có thể vượt qua nhiều biến thay vì một đối tượng 'ExtraStuff' tùy thuộc vào tiêu chuẩn mã hóa / sở thích cá nhân của bạn.