JavaScript. Подробное руководство, 6-е издание, стр. 90
<b> console.log(self === o); // "true": self - знач, this внеш. ф-ции.</b><b> }</b><b> }</b><b>};</b><b>o.m(); // Вызвать метод m объекта о.</b>В примере 8.5 (раздел 8.7.4) демонстрируется более практичный способ использования идиомы
<b>var self=this</b>8.2.3. Вызов конструкторов
Если вызову функции или метода предшествует ключевое слово
<b>new</b>Если вызов конструктора включает список аргументов в скобках, эти выражения-аргументы вычисляются и передаются конструктору точно так же, как любой другой функции или методу. Но если конструктор не имеет параметров, синтаксис вызова конструктора в языке JavaScript позволяет вообще опустить скобки и список аргументов. При вызове конструктора всегда можно опустить пару пустых скобок. Например, следующие две строки полностью эквивалентны:
<b>var о = new Object(); </b><b>var о = new Object;</b>Вызов конструктора создает новый пустой объект, наследующий свойство
<b>prototype</b><b>this</b><b>new о.m()</b>Как правило, в функциях-конструкторах не используется инструкция
<b>return</b><b>return</b><b>return</b>8.2.4. Косвенный вызов
Функции в языке JavaScript являются объектами и подобно другим объектам имеют свои методы. В их числе есть два метода,
<b>call()</b><b>аррlу(),</b><b>this</b><b>саll()</b><b>apply()</b><b>call()</b><b>аррlу()</b>8.3. Аргументы и параметры функций
В языке JavaScript, в определениях функций не указываются типы параметров, а при вызове функций не выполняется никаких проверок типов передаваемых значений аргументов. Фактически при вызове функций в языке JavaScript не проверяется даже количество аргументов. В подразделах ниже описывается, что происходит, если число аргументов в вызове функции меньше или больше числа объявленных параметров. В них также демонстрируется, как можно явно проверить типы аргументов функции, если необходимо гарантировать, что функция не будет вызвана с некорректными аргументами.
8.3.1. Необязательные аргументы
Когда число аргументов в вызове функции меньше числа объявленных параметров, недостающие аргументы получают значение
<b>undefined</b><b>// Добавить в массив а перечислимые имена свойств объекта о и вернуть его.</b><b>// Если аргумент а не не был передан, создать и вернуть новый массив, </b><b>function getPropertyNames(o, /* необязательный */ а) {</b><b> if (а === undefined) а = []; // Если массив не определен, создать новый </b><b> for(var property in о) a.push(property); </b><b> return а;</b><b>}</b><b>// Эта функция может вызываться с 1 или 2 аргументами:</b><b>var а = getPropertyNames(o); // Получить свойства объекта о в новом массиве</b><b>getPropertyNames(p,а); // добавить свойства объекта р в этот массив</b>Вместо инструкции if в первой строке этой функции можно использовать оператор || следующим образом:
<b>а = а || [];</b>В разделе 4.10.2 говорилось, что оператор || возвращает первый аргумент, если он имеет истинное значение, и в противном случае возвращает второй аргумент. В данном примере, если во втором аргументе будет передан какой-либо объект, функция будет использовать его. Но если второй аргумент отсутствует (или в нем будет передано значение
<b>null</b>Обратите внимание, что при объявлении функций необязательные аргументы должны завершать список аргументов, чтобы их можно было опустить. Программист, который будет писать обращение к вашей функции, не сможет передать второй аргумент и при этом опустить первый: он будет вынужден явно передать в первом аргументе значение undefined. Обратите также внимание на комментарий /* необязательный */ в определении функции, который подчеркивает тот факт, что параметр является необязательным.