Чтобы отметить, что я не написал блог в течение 10 лет, первое сообщение в блоге начнется с такой интересной трюки -___-
В ES5, когда мы называем функцию, если параметры, которые должны быть переданы, генерируются на основе других функций или условий, то есть, когда мы не уверены, сколько параметров будет передано, что мы должны делать без изменения исходной функции?
(Конечно, постарайтесь избежать ситуации, описанной в этой статье, такой как изменение параметра на объект или массив и т. Д.)
Большинство людей могут знать, что использование применения может идеально решить эту проблему:
Как и Call, применить первый параметр будет использоваться в качестве вызового объекта функции, то есть указатель этого в функции вызова переписан в качестве первого параметра. Если это не метод объекта, вы можете игнорировать это и пройти ноль.
Разница заключается в том, что следующие параметры, применение, помещают все параметры, которые должны быть переданы в функцию вызова в массив, а вызов добавляется последовательно, как исходная функция.
Поскольку это массив, он контролируется. Создание массива на основе других функций или логических суждений может достичь цели передачи в параметрах динамического числа.
Но я столкнулся с головной болью. Мне пришлось пройти в динамических параметрах при создании объекта с новым. Это занимало только раз в несколько лет:
Если вы используете ES6, с параметром REST, ни одна из вышеперечисленных проблем не является проблематичной. Обратите внимание, что добавление трех точек перед массивом Args не является ошибкой синтаксиса, а метод написания параметров REST, предоставленный ES6. Вы можете понять это как замену ... Args с массивом ARGS с персонажами после квадратных скобок.
Но действительно ли невозможно реализовать в ES5? В конце концов, большинство ES6 - синтаксический сахар, и вы можете использовать такие инструменты, как Babel для компиляции с ES5. С вопросами, давайте использовать Вавилон для компиляции и посмотрим, что мы получаем:
Я был шокирован, когда увидел последнюю линию. Не бойтесь. Давайте проанализируем этот код. Во -первых, давайте расчнем это и посмотрим на три шага:
1. Нет никаких сомнений в том, что использование CONCAT для конкатената NULL с нашими параметрами в массив, как применяется второй параметр, то есть мы получаем [NULL, 1, 2, 3];
2. Давайте рассчитаем применить. Первый параметр Foo заменит функцию, чтобы вызвать нативный метод связывания. Содержание второго массива параметров будет передаваться как параметр связывания, то есть foo.bind (null, 1, 2, 3);
3. Первый параметр метода связывания аналогичен применению и вызову, изменять этот указатель, и последующие параметры могут имплантировать значение предварительного ведущего аргумента по умолчанию для функции. То есть, когда привязка выполняется, мы получаем класс FOO с тремя значениями параметров, введенными в первый набор кронштейнов, который на данный момент называется FoOWOWIthargs;
Наконец, когда мы новичны foowithargs (); , нам не нужно проходить в каких -либо параметрах. Эквивалент новому Foo (1, 2, 3);