Вложенные функции. Работа с вложенными функциями
Вложенные функции. Работа с вложенными функциями
В 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)); |