при использовании addEventListener вы можете предоставить объект конфигурации в качестве второго аргумента, где вы можете указать, что он должен запускаться один раз (как в коде ниже).Что касается передачи дополнительного аргумента в ваш обратный вызов события, вы можете использовать метод bind, предоставив контекст и дополнительный аргумент
var button = document.querySelector('#btn');
button.addEventListener('click', function (params, ev) {
console.log(params);
}.bind(button, { name: 'test'}), {
once: true
})
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<button id="btn">click</button>
</body>
</html>