Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

Практическое применение приема создания пространства имен демонстрируется в примере 8.3. Здесь определяется анонимная функция, возвращающая функцию

extend,
подобную той, что была представлена в примере 6.2. Анонимная функция проверяет наличие хорошо известной ошибки в Internet Explorer и возвращает исправленную версию функции, если это необходимо. Помимо этого, анонимная функция играет роль пространства имен, скрывающего массив с именами свойств.

Пример 8.3. Функция extend, исправленная, если это необходимо

// Определяет функцию extend, которая копирует свойства второго и последующих аргументов

// в первый аргумент. Здесь реализован обход ошибки в IE: во многих версиях IE цикл for/in

// не перечисляет перечислимые свойства объекта о, если одноименное свойство

// его прототипа является неперечислимым. Это означает, что такие свойства,

// как toString, обрабатываются некорректно, если явно не проверять их.

var extend = (function { // Присвоить значение, возвращаемое этой функцией

// Сначала проверить наличие ошибки, прежде чем исправлять ее.

for(var р in {toString:null}) {

// Если мы оказались здесь, значит, цикл for/in работает корректно

// и можно вернуть простую версию функции extend

return function extend(o) {

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

var source = arguments[i];

for(var prop in source) o[prop] = source[prop];

}

return o;

};

}

// Если мы оказались здесь, следовательно, цикл for/in не перечислил

// свойство toString тестового объекта. Поэтому необходимо вернуть версию extend,

// которая явно проверяет неперечислимость свойств прототипа Object.prototype.

// Список свойств, которые необходимо проверить

var protoprops = ["toString", "valueOf", "constructor", "hasOwnProperty",

"isPrototypeOf". "propertylsEnumerable". "toLocaleString"];

return function patched_extend(o) {

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

var source = arguments[i];

// Скопировать все перечислимые свойства

for(var prop in source) o[prop] = source[prop];

// А теперь проверить специальные случаи свойств

for(var j = 0; j < protoprops.length; j++) {

prop = protoprops[j];

if (source.hasOwnProperty(prop)) o[prop] = source[prop];

}

}

return o;

};

}0);

8.6. Замыкания

Как и в большинстве языков программирования, в JavaScript используются лексические области видимости. Это означает, что при выполнении функций действуют области видимости переменных, которые имелись на момент их определения, а не на момент вызова. Для реализации лексической области видимости внутренняя информация о состоянии объекта функции в языке JavaScript должна включать не только программный код функции, но еще и ссылку на текущую цепочку областей видимости. (Прежде чем продолжить чтение этого раздела, вам, возможно, следует повторно прочитать сведения об областях видимости переменных и цепочках областей видимости в разделах 3.10 и 3.10.3.) Такая комбинация объекта функции и области видимости (множества связанных переменных), в которой находятся переменные, используемые вызываемой функцией, в литературе по информационным технологиям называется замыканием}

  • Читать дальше
  • 1
  • ...
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: