Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования javascript 16.02.12.doc
Скачиваний:
7
Добавлен:
31.08.2019
Размер:
2.86 Mб
Скачать

Области видимости

Каждая функция, точнее даже каждый запуск функции задает свою индивидуальную область видимости.

Переменные можно объявлять в любом месте. Ключевое слово var задает переменную в текущей области видимости. Если его забыть, то переменная попадет в глобальный объект window. Возможны неожиданные пересечения с другими переменными окна, конфликты и глюки.

В отличие от ряда языков, блоки не задают отдельную область видимости. Без разницы - определена переменная внутри блока или вне его. Так что эти два фрагмента совершенно эквивалентны:

Заданная через var переменная видна везде в области видимости, даже до оператора var. Для примера сделаем функцию, которая будет менять переменную, var для которой находится ниже.

Например:

function a() {

z = 5 // поменяет z локально..

// .. т.к z объявлена через var

var z

}

// тест

delete z // очистим на всякий случай глобальную z

a()

alert(window.z) // => undefined, т.к. z была изменена локально

Параметры функции

Функции можно запускать с любым числом параметров.

Если функции передано меньше параметров, чем есть в определении, то отсутствующие считаются undefined.

Следующая функция возвращает время time, необходимое на преодоление дистанции distance с равномерной скоростью speed.

При первом запуске функция работает с аргументами distance=10, speed=undefined. Обычно такая ситуация, если она поддерживается функцией, предусматривает значение по умолчанию:

// если speed - ложное значение(т.е. undefined, 0, false...) - подставить 10

speed = speed || 10

Оператор || в возвращает не true/false, а само значение (первое, которое приводится к true).

Поэтому его используют для задания значений по умолчанию. В нашем вызове speed будет вычислено как undefined || 10 = 10.

Поэтому результат будет 10/10 = 1.

Второй запуск - стандартный.

Третий запуск задает несколько дополнительных аргументов. В функции не предусмотрена работа с дополнительными аргументами, поэтому они просто игнорируются.

Ну и в последнем случае аргументов вообще нет, поэтому distance = undefined, и имеем результат деления undefined/10 = NaN (Not-A-Number, не число).

Работа с неопределенным числом параметров

Непосредственно перед входом в тело функции, автоматически создается объект arguments. Переменная arguments доступна внутри функции и содержит аргументы и ссылку на саму функцию.

  1. Аргументы вызова, которые номеруются, начиная от нуля

  2. Длину (количество аргументов при вызове) в свойстве length

  3. Ссылку на саму функцию в свойстве callee

Например,

function func() { //функция без аргументов

// объект arguments создан автоматически

for(var i=0;i<arguments.length;i++) {

alert("arguments["+i+"] = "+arguments[i])

}

}

func('a','b',true)

// выведет

// arguments[0] = a

// arguments[1] = b

// arguments[2] = true

Свойство arguments похоже на массив, т.к. у него есть длина и числовые индексы. На самом деле arguments не принадлежит классу Array и не содержит его методов.

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

var args = Array.prototype.slice.call(arguments)

// .. теперь args - настоящий массив аргументов ..

args.shift()

...

Вызвать функцию для массива аргументов можно при помощи apply:

var func = function(a,b) { alert(a+b) }

var arr = [1,2]

func.apply(null, arr) // => alert(3)