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 .posthà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 doSomethingnó nằm trong phạm vi của doSomethinghàm.
Khi extraStuffđược tham chiếu trong hàm bên trong ẩn danh được trả về của doSomethingnó 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.