1

Тема: JavaScript: редифиниция аргументов

Вот такой код:

function(a, b) {
	if (arguments.length < 2)
		b = a;
}

Вроде всё нормально, но возникла неуверенность: предпоследняя строчка будет присваевать значение локальному аргументу (как и задумано), или, раз он отсутствует, создаст глобальную переменную?

2

Re: JavaScript: редифиниция аргументов

Все что не обьявляется с использованием var - идет в глобальную область видимости. И именно поэтому

for (var i=0; i++; i<5) {
}

гораздо надёжнее, чем просто с i, без var.

3

Re: JavaScript: редифиниция аргументов

Gendelf_Lugansk, ок, понятно. А если так:

function(a, b) {
	var b = (arguments.length < 2) ? a : b;
}

Насколько помню, декларации переменных, по сравнению с функциями, в JS не всплывают в начало блока, но будет ли работать такой код как задуманно или нет? Вернее, будет или не будет - легко проверить, вопрос: должен или не должен?

4

Re: JavaScript: редифиниция аргументов

Должен или нет и как должен работать такой код - я, к сожалению, не могу сказать. Мне кажется, что должен он вызывать ошибку, хотя чёрт его знает. Учитывая, что в JS можно переопределять переменные, а также то, что переменная передастся по значению - скорей всего просто будет создана локальная переменная b, которой присвоится a или b в зависимости от количества параметров.
Однако тут уже стоит задать вопрос "зачем это нужно"? Не могу понять, что Вы хотите чтобы этот код делал? Если нужно просто какое-то значение по умолчанию на случай, если b не будет передано, то вот:

function MyF(a, b) {
  var z = b || a;

  /*дальше делаем что хотим с z, которая будет содержать b, если оно передано, не false, не null, не пустая строка и не 0. Иначе z будет содержать a*/
}

или

function MyF(a, b) {
  var z = a;
  
  if (b != undefined) {
    z = b;
  }

  /*дальше делаем что хотим с z*/
}

Первый способ красивей, но может не подойти в ряде случаев (например, если в b может передаваться 0 или пустая строка)

Отредактировано Gendelf_Lugansk (24-01-2012 02:36)