Я некоторое время боролся с этой проблемой:
<input type="submit" onclick="barPlot(function1())">
<input type="submit" onclick="barPlot(function2())">
Где я пытался, посредством события onclick, разрешить моей функции "barPlot()" выбирать данные из различных функций.
Результат этого в моей функции barPlot, которая выглядела так:
function barPlot(callback) {
var myData = callback();
}
... был "обратный вызов не является функцией".
Когда я, наконец, попробовал это (удаление конечных скобок в вызове), он работал:
<input type="submit" onclick="barPlot(function1)">
<input type="submit" onclick="barPlot(function2)">
Это почему?
(Если у кого-то есть дополнительная критика моего способа сделать это, тогда вам разрешено свободно упоминать об этом. Это практика для меня).
Потому что, если вы добавляете родительские элементы, вы вызываете эту функцию и предоставляете внешнюю функцию значение, возвращаемое выполнением внутреннего.
Это происходит потому, что вы должны предоставить функцию в качестве обратного вызова, но если вы пишете круглые скобки, вы не предоставляете функцию. Вместо этого вы выполняете написанную функцию (из-за скобок) и предоставляете возвращаемое им значение.
addEventListener
и тому подобное), а не обработчики событий в стилеonxyz
, которые требуют, чтобы функции, на которые они ссылаются, были глобальными. (И затем, конечно, сделать функции неглобальными, поскольку глобальное пространство имен действительно переполнено.)