Есть ли разница между аргументами javascript и пользовательскими параметрами в качестве параметров? - PullRequest
3 голосов
/ 08 февраля 2012

Есть ли разница в доступе к аргументам javascript через «аргументы» по умолчанию и использование явного объекта, такого как «параметры»?

похожи ли эти два, кроме того, что один обращается к аргументам массива, а другой - к параметрам объекта?

$.fn.myFn = function(){
  if arguments[0]//....
}

и

$.fn.myFn = function(options){
  if options.value //....
}

Ответы [ 6 ]

10 голосов
/ 08 февраля 2012

Да, они похожи, но они тоже разные.Я бы не стал использовать arguments для всего, что действительно не должно обрабатывать переменные числа аргументов;Я бы использовал объявленные аргументы и / или объект options.(Также обратите внимание, что на большинстве движков JavaScript, использование псевдомассива arguments [это не совсем массив] влечет за собой штраф за скорость выполнения по сравнению с использованием объявленных аргументов или даже объекта options. См."примечание стороны" ниже, хотя, конечно, вы должны вызывать функцию lot , чтобы эти издержки имели значение в реальном мире.)

Использование объявленных аргументов для функций, которые принимают только паруаргументов, как правило, имеет смысл, например:

x = parseInt(str, 10);

Если бы parseInt использовал объект options в стиле, вам нужно было бы написать это как:

x = parseInt({string: str, radix: 10}); // Note: parseInt doesn't actually work this way

..или аналогичный, который больше печатать при каждом вызове.Так что это недостаток.

Но когда вы получаете много аргументов и особенно много необязательных аргументов, использование шаблона options, в котором вы передаете объект вместо дискретных аргументов, можетиметь реальные выплаты.Рассмотрим функцию jQuery ajax .Он имеет ~ 32 опции , которые вы можете передать на него, почти все они необязательны.Точно так же, как вы, вероятно, не захотите кодировать каждый parseInt, как указано выше, вы, вероятно, не захотите кодировать каждый ajax вызов следующим образом:

$.ajax(
    "/path/to/resource",
    function(data) {
    },
    undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined,
    undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined,
    undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined,
    undefined, undefined, undefined, undefined, undefined, undefined
);

... либо.: -)

Одно практическое правило, которое я слышал о дискретных аргументах и ​​объектах стиля options, - когда вы получите четыре аргумента, люди начнут терять.Конечно, вы захотите нарисовать собственную линию.


Примечание: подробнее о том, что arguments медленнее, чем объявленные аргументы, попробуйте этот тест .Теперь, конечно, накладные расходы не имеют значения большую часть времени , поэтому большую часть времени это не имеет значения .Но для тех времен это так, вот результаты от меня и других:

enter image description here

Как вы можете видеть, использование объявленных аргументов является самым быстрым на сегодняшний день практически во всех движках.Я даже добавил что-то, сравнивающее arguments с передачей в массиве, для тех случаев вам действительно нужно переменное количество аргументов (ответ: с массивом вам лучше).

2 голосов
/ 08 февраля 2012

Использование arguments замедляет выполнение вашей функции, но разница заметна только в том случае, если вы часто вызываете эту функцию. Используйте его только когда вам нужны переменные аргументы в вашей функции. Кроме того, использование аргументов, когда вам не нужны переменные аргументы, усложняет понимание, поскольку у вас нет имен переменных.

2 голосов
/ 08 февраля 2012

Различие состоит в том, что в первом случае arguments - это фактический список аргументов, переданных функции, а во втором случае option - это только один из аргументов (arguments[0]), и он содержит фактические "аргументы" по договоренности.

В отличие от таких языков, как Python, Javascript не предоставляет встроенных способов смешивания ключевых слов и позиционных аргументов.

1 голос
/ 08 февраля 2012

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

options, с другой стороны, позволяет указывать именованные аргументы для вашей функции без явного порядка. Это особенно удобно, например, при расширении существующих функций, не беспокоясь о коллизии / обратной совместимости со строгими сигнатурами функций.

1 голос
/ 08 февраля 2012

Очевидно, что есть некоторая синтаксическая разница, как указывает @missigno. Но если вы спрашиваете, почему вы должны делать то или другое - метод явного объекта - это способ предоставления именованных параметров в javascript.

Это может быть полезно, если у вас может быть большое количество аргументов, но большую часть времени нужно указывать только несколько из них. Некоторые люди также предпочитают его по эстетическим причинам - название опции отображается рядом со значением, поэтому вам не нужно просто знать, что делает, например, аргумент 3.

1 голос
/ 08 февраля 2012

Формально, разница в том, что $.fn.myFn.length это либо 0, либо 1 (потому что функция определяется с 0 аргументами в первом случае и 1 аргументом во втором случае), хотя обычно вам это не нужноэто свойство.

Кроме этого, оба работают одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...