Статьи

Параметры ключевых слов в JavaScript и ECMAScript.next


В этом посте объясняется, что представляют собой параметры ключевых слов, как их можно смоделировать в JavaScript, и какие улучшения принесет ECMAScript.next.
Очевидно, что то, что здесь сказано о методах, применимо и к функциям.

Позиционные параметры и ключевые параметры. При вызове метода на языке программирования фактические параметры (указанные вызывающей стороной) должны быть сопоставлены с формальными параметрами (определения метода). Есть два распространенных способа сделать это:

  • Позиционные параметры отображаются по положению: первый фактический параметр сопоставляется с первым формальным параметром и т. Д.
  • Параметры ключевых слов используют ключевые слова (метки) для выполнения сопоставления. Ключевые слова связаны с формальными параметрами в определении метода и обозначают фактические параметры в вызове метода. Неважно, в каком порядке появляются ключевые параметры, если они правильно помечены. В следующих разделах объясняется, почему параметры ключевых слов полезны, и приводятся примеры.

Параметры ключевых слов как описания. Как только метод имеет более одного параметра, может возникнуть путаница в отношении того, для чего используется каждый параметр. Например, допустим, у вас есть тип Entries, который управляет записями некоторого вида. Учитывая записи экземпляра, вы можете сделать следующий вызов метода.

    entries.select(3, 5);

Что означают эти два числа? Python поддерживает параметры ключевых слов, и они позволяют легко увидеть, что происходит:

    entries.select(from=3, to=5)

Параметры и параметры ключевых слов. Необязательные параметры метода иногда называют его параметрами . Позиционные параметры неудобны, если параметры могут быть опущены где угодно (не только в конце). Тогда любое подмножество опций может быть активным, и часто приходится вставлять пробелы, такие как ноль, для неактивных. Параметры ключевых слов помогают с опциями двумя способами: они четко описывают, какие параметры являются активными, и позволяют просто отбрасывать неактивные параметры.

JavaScript. В JavaScript нет встроенной поддержки параметров ключевых слов, таких как Python и многие другие языки. Но есть довольно элегантное моделирование: предоставьте необязательные параметры через литерал объекта. Результатом является так называемый объект параметров, который назначается одному формальному параметру. Используя эту технику, вызов select () выглядит следующим образом:

    entries.select({ from: 3, to: 5 });

Метод получает объект параметров со свойствами от и до. Вы можете отказаться от любого из вариантов:

    entries.select({ from: 3 });
    entries.select({ to: 5 });
    entries.select();

Очевидно, вы также можете ввести позиционные параметры. Обычно опции располагаются последними, но JavaScript не заставляет вас делать это.

    entries.select(value1, value2, { from: 3, to: 5 });

Метод select () будет реализован следующим образом в текущем JavaScript:

    Entries.prototype.select = function (options) {
        if (options === undefined) options = {};
        if (options.from === undefined) options.from = 0;
        if (options.to === undefined) options.to = this.length;
        
        // Use options.from and options.to
    };

Не особенно элегантно. Его можно немного укоротить, но тогда вам придется беспокоиться о том, какие значения JavaScript считает ложными:

    Entries.prototype.select = function (options) {
        if (!options) options = {};
        if (!options.from) options.from = 0;
        if (!options.to) options.to = this.length;
        
        // Use options.from and options.to
    };

EcmaScript.next. В ECMAScript.next мы получаем гораздо более удобное решение (
напоминание через Брендана Эйха):

    Entries.prototype.select = function (
        { from = 0, to = this.length }) {
        
        // Use `from` and `to`
    };

Аллен Уирфс-Брок
отмечает, что если вы хотите, чтобы люди могли опускать объект параметров, то вышеприведенное изменится на:

    Entries.prototype.select = function (
        { from = 0, to = this.length } = {}) {
        
        // Use `from` and `to`
    };

 

С http://www.2ality.com/2011/11/keyword-parameters.html