Ваш "Случай 2" не будет выполнен, потому что removeEventListener
будет вызываться без какого-либо определенного значения this
, и поэтому он не будет вызываться с this
, установленным на el
. Действительное сравнение будет:
Дело 1:
setTimeout(function(){ el.removeEventListener('click', console.log, true) }, 100 )
Случай 2:
setTimeout(el.removeEventListener.bind(el), 100, 'click', console.log, true)
// ------------------------------^^^^^^^^^
То, что вы используете, зависит от того, что вы хотите сделать.
В этой конкретной ситуации не имеет значения, какой вы используете, если вы решаете проблему this
. Но подумайте:
var x = function() { /* do something */};
el.addEventListener("click", x, false);
setTimeout(function() { el.removeEventListener("click", x, true); }, 100);
x = function() { /* do something else */};
// ...
Этот вызов removeEventListener
завершится неудачно, поскольку с момента запуска обратного вызова таймера x
больше не относится к подключенной функции (это относится к другой функции). Но ваш предпочтительный синтаксис:
var x = function() { /* do something */};
el.addEventListener("click", x, false);
setTimeout(el.removeEventListener.bind(el), 100, "click", x, true);
x = function() { /* do something else */};
// ...
... будет работать, потому что x
вычисляется при вызове setTimeout
, а не позже, поэтому оно относится к правильной функции.
Иногда вы хотите значение x
позже, в этом случае вы будете использовать форму «Случай 1». Если вы хотите, чтобы x
был оценен сразу, «Вариант 2» - это форма, которую вы хотите использовать.
Примечание: использование true
в качестве третьего аргумента для addEventListener
/ removeEventListener
встречается относительно редко. Он перехватывает (и отцепляет) обработчики для фазы capture события, а не для более обычной фазы всплытия.