Вложенные функции. Работа с вложенными функциями

Вложенные функции. Работа с вложенными функциями

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

functionfoo(a) { functionbar() { returna * a }// Определениевложеннойфункции   returnbar(); // Вернуть значение, возвращаемое вложенной функцией }   document.write(foo(5));

Внутри вложенной функции можно обращаться к параметрам и локальным переменным вмещающей функции (внешней):

functionfoo(a) { varx = 0;   functionbar() { x = 10; returna * x // Используем локальную переменнуюx и параметрa, заданные во внешней функции }   returnbar(); // Вернуть значение, возвращаемое вложенной функцией }   document.write(foo(5));

Объекты JavaScript. Понятие объекта. Виды объектов

Объект в JScript — это коллекция свойств (иначе: ассоциативный массив, список), состоящая из пар ключ(имя)-значение. Позволяет сохранять и извлекать значения по их именам.

!!!ВJavaScript есть 6 базовых типов данных — это Undefined (обозначающий отсутствие значения), Null, Boolean (булев тип), String (строка), Number (число) и Object (объект).При этом первые 5 являются примитивными типами данных, а Object — нет.Следует различать примитивные типыString, Number и Boolean и не-примитивные «подтипы» Object: String, Number и Boolean соответственно.
Это означает, что строку 'Hello, world', например, можно создать и как примитивное значение, и как объект типа String. СРАВНИТЕ:

obj=new String('hello'); //Создаем строку как объект
simple='hello';//Создаем примитивное значение

obj.prop='text';
simple.prop='text';

alert(obj.prop); //text - раз obj обычный объект, то мы можем запросто придать ему еще одно свойство
alert(simple.prop); //undefined - а вот simple не объект, и этот номер у нас не пройдет

Фундаментальным отличием объектов от примитивов, является их хранение и копирование «по ссылке».Ссылка — это средство доступа к объекту под различными именами.

test={prop: 'sometext'}; //Создаем объект со свойством prop
test_link=test; //Создаем еще одну ссылку на этот объект
alert(test.prop); //sometext
alert(test_link.prop); //sometext

//Изменяем свойство объекта
test_link.prop='newtext';

alert(test.prop); //newtext
alert(test_link.prop); //newtext
/*Можно было бы сказать, что свойство изменилось и там и тут - но это не так.
Объект-то один. Так что свойство изменилось в нем один раз, а ссылки просто продолжают указывать туда, куда и указывают. */

Создание объектов.Пустой объект («пустой шкаф») может быть создан одним из двух синтаксисов:

1. o = newObject();

2. o = {}; // пустые фигурные скобки

Обычно все пользуются синтаксисом (2), т.к. он короче.

Например, вот как выглядит создание объекта с тремя свойствами:

varuser = {

name: "Homer",

"age": 45,

1: true //Числовые имена свойств автоматически преобразуются в строки.

};

В javaScript существует несколько видов объектов:

· встроенные;

· клиентские (объекты браузера, в частностиобъекты HTML-документа);

· объекты, которые программист создает самостоятельно (пользовательские).

Встроенные объекты — это предопределенные объекты Number, String, Array, Date, Math, Function, Booleanи др.

Объекты браузера. С точки зрения сценария JavaScript браузер представляется иерархически организованным набором объектов. Сразу отметим, что объекты могут быть вложенными друг в друга. Вот некоторые из них:

  • window - внутри этого объекта создаются остальные объекты браузера;
  • window.document - содержит элементы, определяемые на самой странице;
  • window.document.имя_формы - форма на странице;
  • window.document.имя_формы.имя_элемента - содержит элементы формы.

Объект windowнаходится в корне иерархии. Когда в окно браузера загружается документ HTML, внутри этого объекта создаются другие объекты -document, parent, frame, location и top.

Объект document содержит в себе другие объекты, состав которых полностью определяется документом HTML, загруженным в окно браузера. Это могут быть формы, ссылки на другие документы HTML или локальные ссылки внутри одного документа, объекты, определяющие адрес URL документа и так далее.

Пользовательские - создаваемые с помощью литерала объекта или оператора new с конструктором.(см. подробнее вопрос 17).

15. Объект String(строка) , его свойства и методы

Создание

a = 'mystring'

b = new String(object) // синтаксис устарел и не используется

c = String(object

Обычно объекты Stringсоздаются неявно с помощью строковых литералов.

var str = "stringliteral"// кавычки любые - без разницы

Строки могут содержать специальные символы. Самый часто используемый–«перевод строки».Он обозначается как \n, например:

alert( 'Привет\nМир' ); // выведет "Мир" на новой строке

Если строка в одинарных кавычках, то внутренние одинарные кавычки внутри должны быть экранированы, то есть снабжены обратным слешем \', вот так:

varstr = 'I\'m a JavaScriptprogrammer';

Свойства и методы

Длина строки(length)– свойство

varstr="My\n";// имеем 3 символа. Третий - перевод строки( \n)alert(str.length);// 3

Получение символа:

1. charAt(позиция)– метод:varstr="jQuery";alert(str.charAt(0));// "j"

2. квадратные скобки:

varstr="Я - современный браузер!";alert(str[0]);// "Я"

Разница между этим способом и charAt заключается в том, что если символа нет – charAtвыдает пустую строку, а скобки – undefined.

Изменение

Содержимое строкив JavaScriptнельзя изменять. Нельзя взять символ посередине и заменить его. Как только строка создана – она такая навсегда.

Только если так:varstr="строка";str=str[3]+str[4]+str[5];alert(str);// ока

Смена регистра

toUpperCase() и toUpperCase()– методы

alert("Интерфейс".toUpperCase());// ИНТЕРФЕЙСalert("Интерфейс"[0].".toUpperCase());// 'и'

Поиск подстроки

indexOf(подстрока[, начальная_позиция]).Метод возвращает позицию, на которой находится подстрока или -1, если ничего не найдено.

varstr="Widgetwithid"; alert(str.indexOf("Widget"));// 0, т.к. "Widget" найден прямо в начале stralert(str.indexOf("id"));// 1, т.к. "id" найден, начиная с позиции 1alert(str.indexOf("widget"));// -1, не найдено, так как поиск учитывает регистр

Необязательный второй аргумент позволяет искать, начиная с указанной позиции.

Преобразование в массив

split(s, arg) позволяет превратить строку в массив, разбив ее по разделителю s. В примере ниже таким разделителем является строка из запятой и пробела.

varnames = 'Маша, Петя, Марина, Василий';

vararr = names.split(', ');

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

alert( 'Вам сообщение ' + arr[i] );

}

Второй аргумент split

У метода split есть необязательный второй аргумент (arg) – ограничение на количество элементов в массиве. Если их больше, чем указано – остаток массива будет отброшен:

alert("a,b,c,d".split(',',2));// a,b

Разбивка по буквам

Вызов split с пустой строкой разобьёт по буквам:

varstr="тест";

alert(str.split(''));// т,е,с,т

Объединение

concat(string2, string3[, ..., stringN])

string2...stringN–строки, которые будут прибавлены к string1

a = "строка"

b = " очень"

с = " длинная"

alert(a.concat(b,c)) // строка очень длинная

Slice

Отрицательные значения отсчитываются от конца строки:

alert( "testme".slice(-2) ); // "me", от 2 позиции с конца

alert( "testme".slice(1, -1) ); // "estm", от 1 позиции до первой с конца.

Это гораздо более удобно, чем странная логика substring.

Отрицательное значение первого параметра поддерживается в substr во всех браузерах, кроме IE8-.

Если выбирать из этих трёх методов один, для использования в большинстве ситуаций – то это будет slice: он и отрицательные аргументы поддерживает и работает наиболее очевидно.

String.fromCharCode(code)

Возвращает символ по коду code:

alert( String.fromCharCode(1072) ); // 'а'

…И метод для получения цифрового кода из символа:

Str.charCodeAt(pos)

Возвращает код символа на позиции pos. Отсчет позиции начинается с нуля.

alert( "абрикос".charCodeAt(0) ); // 1072, код 'а'

Почему сравнения 'ё' > 'я' и 'а' > 'Я' дают такой странный результат?

Дело в том, что символы сравниваются не по алфавиту, а по коду. У кого код больше – тот и больше. В юникоде есть много разных символов. Кириллическим буквам соответствует только небольшая часть из них, подробнее – Кириллица в Юникоде.

Выведем отрезок символов юникода с кодами от 1034 до 1113:

varstr = '';

for (var i = 1034; i <= 1113; i++) {

str += String.fromCharCode(i);

}

alert( str );

Результат:

ЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљ

Мы можем увидеть из этого отрезка две важных вещи:

1. Строчные буквы идут после заглавных, поэтому они всегда больше.

В частности, 'а'(код 1072) > 'Я'(код 1071).

То же самое происходит и в английском алфавите, там 'a' > 'Z'.

2. Ряд букв, например ё, находятся вне основного алфавита.

В частности, маленькая буква ё имеет код, больший чем я, поэтому 'ё'(код 1105) > 'я'(код 1103).

Кстати, большая буква Ё располагается в Unicode до А, поэтому 'Ё'(код 1025) < 'А'(код 1040). Удивительно: есть буква меньше чем А :)

Date

Дата измеряется в миллисекундах, начиная от полуночи 01 января 1970 года GMT+0. День содержит 86,400,000 миллисекунд.

Создание

dateObj = new Date()
dateObj = new Date(dateVal)
dateObj = new Date(year, month, date[, hours, minutes, seconds, ms] )

Возможные аргументы

DateVal

–если параметр является числовым, то он интерпретируется как количество миллисекунд от 1-Янв-1970 00:00;

– если задан строкой, то она разбивается и интерпретируется как дата по стандартным правилам Date.parse.

year–год в формате YYYY.

month –месяц от 0 (Янв) до 11 (Дек).

date –день месяца от 1 до 31.

hours –параметр должен быть указан, если указан параметр minutes. Устанавливает кол-во часов от 0 до 23.

minutes –параметр должен быть указан, если указан параметр seconds. Устанавливает количество минут: от 0 до 59.

seconds –параметр должен быть указан, если указан параметр ms. Устанавливает количество секунд: от 0 до 59.

мs –количество миллисекунд: от 0 до 999.

Если конструктор запущен без аргументов, то возвращается текущая дата.

Созданиетекущей даты:new Date()

var today= new Date()

При вызове с одним аргументом - строкой, строка разбирается и интерпретируется как дата, так же, как и в методе Date.parse.

Пример: создать дату из строки

var date = new Date("21 May 1958 10:12") // используется редко

При объявлении с несколькими аргументами, отсутствующие аргументы автоматически считаются равными 0.

Date.parse.Метод parse получает строку с датой (напр. "Jan 03, 2000") и возвращает целое число, представляющее собой количество миллисекунд, истекших с полуночи 1 января 1970 года GMT+0 до даты, указанной в параметре dateVal.

Это статический метод, который можно вызывать без создания объекта даты, поэтому для доступа к нему используется форма Date.parse, а не объект .parse.

var d = new Date();
d.setTime(Date.parse("21 May 1958 10:12"));
document.write(d.toLocaleString());
 
// Выведет на экран следующий результат:
Wednesday, May 21, 1958 10:12:00

В случае, если метод parse не смог разобрать переданную ему в качестве параметра строку, он возвращает значение NaN.

True

};

Создание объекта с помощью оператора new:

varo = newObject();

   

Методы объекта

Метод – это функция, которая хранится в качестве значения в свойстве объекта и может вызываться посредством этого объекта.

Вызов метода осуществляется точно также, как и вызов обычной функции – с помощью оператора()(оператор вызова):

varobj = {

name: "Гомер",

write_hello: function() {// задание метода

document.write("Привет");

}

};

obj.write_hello(); //вызов метода>>>>Привет

Для доступа к свойствам объекта внутри метода используется ключевое слово this. Оно содержит ссылку на объект, с помощью которого был вызван метод:

varo = {

name: "Homer",

sayName: function() {

alert(this.name);

}

};

o.sayName(); // "Homer"

Вместо ключевого слова this можно использовать непосредственно имя объекта, но это не очень удобно, так как, если изменится имя объекта, в методах придётся также изменять имя.

ДОПОЛНИТЕЛЬНО

Конструктор - это функция, которая выполняет инициализацию свойств объекта и предназначена для использования совместно с оператором new:

//определяем конструктор

functionCar(seats) {

this.seats = seats;

this.canDrive = true;

}

//вызываем конструктор для создания нового объекта

varmyCar = newCar("leather");

Вложенные функции. Работа с вложенными функциями

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

functionfoo(a) { functionbar() { returna * a }// Определениевложеннойфункции   returnbar(); // Вернуть значение, возвращаемое вложенной функцией }   document.write(foo(5));

Внутри вложенной функции можно обращаться к параметрам и локальным переменным вмещающей функции (внешней):

functionfoo(a) { varx = 0;   functionbar() { x = 10; returna * x // Используем локальную переменнуюx и параметрa, заданные во внешней функции }   returnbar(); // Вернуть значение, возвращаемое вложенной функцией }   document.write(foo(5));

Наши рекомендации