Это не сложно.Независимо от того, какую функцию Javascript вы назначите onChange, она будет вызвана в соответствующее время и получит один единственный аргумент, обычно известный как e
.Вы можете дать этому аргументу любое имя в своей функции (или вообще не объявлять его), но первый аргумент будет там.
Итак, когда вы сделаете это:
onChange={() => this.setField()}
Вы игнорируете аргумент, переданный вашему обработчику событий, а затем внутри того обработчика событий, который вы вызываете this.setField()
, который, что неудивительно, не передает никакого аргумента setField()
.В действительности то, что происходит на самом деле, таково:
onChange={(e) => this.setField()}
Как узнать, как связать событие с e?распространяется ли эта функциональность на другие вещи при работе с html?
В спецификации DOM говорится, что при вызове обработчика события onChange ему будет передан объект e
в качестве первого аргумента (независимо от того,объявить это или нет, это как первый аргумент функции).Это просто, как обратные вызовы работают в Javascript.Вызывающая сторона обратного вызова решает, какие аргументы они собираются передать обратному вызову.Когда вы объявляете обратный вызов, вам решать, объявляете ли вы аргумент и используете его или нет.Независимо от того, как вы объявляете это, вызывающий передает его.
Для этого раздела кода:
onChange={this.setField}
Вы говорите, что функция, которую вы хотите быть обработчиком события onChange, является вашей setField()
метод.Поэтому неудивительно, что когда DOM вызывает этот метод, он передает объект события в качестве первого аргумента, как в приведенном выше примере.
Этот я действительно не понимаю, почему он работает, но этоделает.Я предполагаю, что он по своей сути знает, чтобы передать событие в качестве функции по умолчанию.Опять же, эта встроенная логика встречается где-то еще, может быть, не обязательно для событий?
Как описано ранее, в спецификации DOM указан этот обработчик событий.В определении этого он описывает, какие аргументы будут или не будут передаваться любой функции обратного вызова, которую вы регистрируете как этот обработчик событий.Это верно для всех обратных вызовов в Javascript.Вызывающий абонент решает, что он передаст в обратный вызов.Это не относится к этому типу обработчика событий.Обратные вызовы используются во многих местах в Javascript.Даже что-то вроде array.filter()
принимает обратный вызов, и вызывающий вызов (в данном случае реализация объекта Array) определяет, какие аргументы передаются в обратный вызов.