Если вы хотите передать одну переменную, но сохранить контекст this
, вы можете использовать карри или частичное применение:
Ваша функция должнаполучить значение и вернуть другую функцию. Таким образом, вы можете сделать следующее:
function callback(num) {
return function() {
console.log(num);
console.log(this.id);
}
}
var number = 1;
document.getElementById("hello").addEventListener("click", callback(number));
//change the variable
number = 2;
document.getElementById("world").addEventListener("click", callback(number));
//change the variable again
number = 3;
<button id="hello">Hello</button>
<button id="world">World</button>
Та же идея, но вместо того, чтобы ваш обратный вызов возвращал новую функцию, она просто потребуетодин аргумент и работает нормально, вам нужна другая функция, которая будет выполнять частичное применение:
function callback(num) {
console.log(num);
console.log(this.id);
}
var number = 1;
document.getElementById("hello").addEventListener("click", partial(callback, number));
//change the variable
number = 2;
document.getElementById("world").addEventListener("click", partial(callback, number));
//change the variable again
number = 3;
function partial(fn, arg) {
return function() {
return fn.call(this, arg);
}
}
<button id="hello">Hello</button>
<button id="world">World</button>
Функция частичного применения может быть обобщена для обработки любой суммы или аргументов
В ES6:
function partial(fn, ...args) {
return function(...otherArgs) {
return fn.apply(this, [...args, ...otherArgs]);
}
}
InES5:
function partial(fn) {
var args = [].prototype.slice.call(arguments, 1);
return function() {
var otherArgs = [].[].prototype.slice.call(arguments);
return fn.apply(this, args.concat(otherArgs));
}
}