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

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

Шрифт:

var scope = "глобальная";

function constructFunction {

var scope = "локальная";

return new Function("return scope”); // Здесь не используется

// локальная область видимости!

} ;

// Следующая строка вернет "глобальная", потому что функция, возвращаемая

// конструктором Function, является глобальной.

constructFunction; // => "глобальная"

Точнее всего конструктор

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

8.7.7. Вызываемые объекты

В разделе 7.11 мы узнали, что существуют объекты, «подобные массивам», которые не являются настоящими массивами, но во многих случаях могут интерпретироваться как массивы. Аналогичная ситуация складывается с функциями. Вызываемый объект - это любой объект, который может быть вызван в выражении вызова функции. Все функции являются вызываемыми объектами, но не все вызываемые объекты являются функциями.

Вызываемые объекты, не являющиеся функциями, встречаются в современных реализациях JavaScript в двух ситуациях. Во-первых, веб-броузер IE (версии 8 и ниже) реализует клиентские методы, такие как

Window.alert
и
Document.getElementsByld,
используя вызываемые объекты, а не объекты класса
Function
. Эти методы действуют в IE точно так же, как в других броузерах, но они не являются объектами
Function
. В IE9 был выполнен переход на использование настоящих функций, поэтому со временем эта разновидность вызываемых объектов будет использоваться все меньше и меньше.

Другой типичной разновидностью вызываемых объектов являются объекты

RegExp
– во многих броузерах предоставляется возможность напрямую вызывать объект
RegExp
, как более краткий способ вызова его метода
ехес.
Эта возможность не предусматривается стандартом JavaScript. В свое время она была реализована компанией Netscape и подхвачена другими производителями для обеспечения совместимости. Старайтесь не писать программы, опирающиеся на возможность вызова объектов
RegExp
: данная особенность, скорее всего, будет объявлена нерекомендуемой и будет ликвидирована в будущем. Оператор
typeof
не во всех броузерах одинаково распознает вызываемые объекты
RegExp
. В одних броузерах он возвращает строку «function», а в других - «object».

Если в программе потребуется определить, является ли объект настоящим объектом функции (и обладает методами функций), сделать это можно, определив значение атрибута class (раздел 6.8.2), использовав прием, продемонстрированный в примере 6.4:

function isFunction(x) {

return Object.prototype.toString.call(x) === "[object Function]";

}

Обратите внимание, насколько эта функция

isFunction
похожа на функцию
isArray,
представленную в разделе 7.10.

8.8. Функциональное программирование

JavaScript не является языком функционального программирования, как

Lisp
или
Haskell
, но тот факт, что программы на языке JavaScript могут манипулировать функциями как объектами означает, что в JavaScript можно использовать приемы функционального программирования. Масса методов в ECMAScript 5, таких как
mар
и
reduce,
сами по себе способствуют использованию функционального стиля программирования. В следующих разделах демонстрируются приемы функционального программирования на языке JavaScript. Их цель - не подтолкнуть вас к использованию этого замечательного стиля программирования, а показать широту возможностей функций в языке JavaScript. 15

15

(Если эта тема вам любопытна, вероятно, вас заинтересует возможность использования (или хотя бы знакомства) библиотеки Functional JavaScript Оливера Стила (Oliver Steel), которую можно найти по адресу: http://osteele.com/sources/javascript/functional/

8.8.1. Обработка массивов с помощью функций

Представим, что у нас имеется массив чисел и нам необходимо найти среднее значение и стандартное отклонение для этих значений. Эту задачу можно было бы решить без использования приемов функционального программирования, как показано ниже:

var data = [1,1,3,5,5]; // Массив чисел

// Среднее - это сумма значений элементов, деленная на их количество

var total = 0;

for(var і = 0; і < data.length; і++) total += data[i];

var mean = total/data.length; // Среднее значение равно З

// Чтобы найти стандартное отклонение, необходимо вычислить сумму квадратов

// отклонений элементов от среднего,

total = 0;

  • Читать дальше
  • 1
  • ...
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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