И почему / как использование скобок имеет значение при вызове функции, определенной как константа?
layoutItemButtonClick
аналогичен любой другой переменной доступа.Он преобразуется в значение переменной, которая является объектом функции.
layoutItemButtonClick()
otoh вызывает функцию и преобразуется в ее возвращаемое значение.
Следовательно,
$('.layout-item-button').click(layoutItemButtonClick())
передает возвращаемое значение из layoutItemButtonClick
(что составляет undefined
) в .click
, тогда как
$('.layout-item-button').click(layoutItemButtonClick())
передает сам объект функции в .click
.
Я получаю ошибку element is not defined
.
И правильно, потому что element
не определено в области, доступной для layoutItemButtonClick
.Он определяется только внутри DOMContentLoaded
обработчика событий.
Вам нужно будет передать element
в качестве аргумента layoutItemButtonClick
.Таким образом, функция должна быть объявлена как
export const layoutItemButtonClick = function(element) { ... }
Теперь нам нужно вызвать layoutItemButtonClick
, чтобы this
ссылался на элемент, по которому щелкнули, и мы передали element
в качестве аргумента.Мы можем сделать это, используя .call
:
$('.layout-item-button').click(function() {
layoutItemButtonClick.call(this, element);
});
Однако нет необходимости использовать this
внутри layoutItemButtonClick
.Мы можем просто сделать элемент, который вызвал событие, явным аргументом:
export const layoutItemButtonClick = function(trigger, element) {
const selectedLayout = trigger.dataset.layout.split("")
doQqthing(element);
};
и вызвать его как
$('.layout-item-button').click(function() {
layoutItemButtonClick(this, element);
});