Главная страница
Навигация по странице:

  • Размещение кода JavaScript на HTML-странице

  • Контрольные вопросы по JavaScript

  • Лабораторная работа 5. Динамические элементы вебстраниц


    Скачать 86.68 Kb.
    НазваниеЛабораторная работа 5. Динамические элементы вебстраниц
    Дата25.02.2019
    Размер86.68 Kb.
    Формат файлаdocx
    Имя файлаLab_05.docx
    ТипЛабораторная работа
    #68817

    Основы WEB-программирования
    Лабораторная работа №5.
    «Динамические элементы веб-страниц»

    Цель: формирование практических навыковсоздания динамических элементов интерфейса веб-страницы.

    Задачи: разработка динамических элементов интерфейса веб-страницы, добавление раскрывающегося меню, блока слайд-шоу, вкладок.
    Теоретические сведения.
    Гипертекстовая информационная система состоит из множества информационных узлов, множества гипертекстовых связей, определенных на этих узлах и инструментах манипулирования узлами и связями. Технология World Wide Web - это технология ведения гипертекстовых распределенных систем в Internet, и, следовательно, она должна соответствовать общему определению таких систем. Это означает, что все перечисленные выше компоненты гипертекстовой системы должны быть и в Web.

    Web как гипертекстовую систему можно рассматривать с двух точек зрения. Во-первых, как совокупность отображаемых страниц, связанных гипертекстовыми переходами (ссылками - контейнер ). Во-вторых, как множество элементарных информационных объектов, составляющих отображаемые страницы (текст, графика, мобильный код и т.п.). В последнем случае множество гипертекстовых переходов страницы - это такой же информационный фрагмент, как и встроенная в текст картинка.
    При втором подходе гипертекстовая сеть определяется на множестве элементарных информационных объектов самими HTML-страницами, которые и играют роль гипертекстовых связей. Этот подход более продуктивен с точки зрения построения отображаемых страниц "на лету" из готовых компонентов.
    При генерации страниц в Web возникает дилемма, связанная с архитектурой "клиент-сервер". Страницы можно генерировать как на стороне клиента, так


    • на стороне сервера. В 1995 году специалисты компании Netscape создали механизм управления страницами на клиентской стороне, разработав язык программирования JavaScript.


    Таким образом, JavaScript - это язык управления сценариями просмотра гипертекстовых страниц Web на стороне клиента. Если быть более точным, то JavaScript - это не только язык программирования на стороне клиента. Liveware, прародитель JavaScript, является средством подстановок на стороне сервера Netscape. Однако наибольшую популярность JavaScript обеспечило программирование на стороне клиента.
    Основная идея JavaScript состоит в возможности изменения значений атрибутов HTML-контейнеров и свойств среды отображения в процессе просмотра HTML-страницы пользователем. При этом перезагрузки страницы не происходит. На практике это выражается в том, что можно, например, изменить цвет фона страницы или интегрированную в документ картинку, открыть новое окно или выдать предупреждение. Название "JavaScript" является зарегистрированным товарным знаком компании Sun Microsystems. Реализация языка, осуществленная разработчиками Microsoft, официально называется JScript . Версии JScript совместимы (если быть совсем точным, то не до конца) с соответствующими версиями JavaScript, т.е. JavaScript является подмножеством языка JScript. В данный момент JavaScript полностью занимает нишу браузерных языков. На синтаксис JavaScript оказал влияние язык Java, откуда и произошло название JavaScript; как и Java, язык JavaScript является объектным. Однако на этом их связь заканчивается: Java и JavaScript - это разные языки, ни один не является подмножеством другого.
    Стандартизация языка была инициирована компанией Netscape и осуществляется ассоциацией ECMA (European Computer Manufacturers Association - Ассоциация европейских производителей компьютеров). Стандартизированная версия имеет название ECMAScript и описывается стандартом ECMA-262.
    Первая версия стандарта (принята в 1997 г.) примерно соответствовала JavaScript 1.1. Отметим, что не все реализации JavaScript на сегодня полностью соответствуют стандарту ECMA. В рамках данного курса мы во всех случаях будем использовать название JavaScript.

    Размещение кода JavaScript на HTML-странице
    Главный вопрос любого начинающего программиста: "Как оформить программу и выполнить ее?".
    Попробуем на него ответить как можно проще, но при этом не забывая обо всех способах применения JavaScript-кода.
    Во-первых, исполняет JavaScript-код браузер. В него встроен интерпретатор JavaScript. Следовательно, выполнение программы зависит от того, когда и как этот интерпретатор получает управление. Это, в свою очередь, зависит от функционального применения кода. В общем случае можно выделить четыре способа функционального применения JavaScript:
    • гипертекстовая ссылка (схема URL);
    • обработчик события (в атрибутах, отвечающих событиям);
    • подстановка (entity);
    • вставка (контейнер
    ) происходит событие Load и, соответственно, будет вызван обработчик этого события onLoad:



    ...

    VALUE="&{window.location.href};">


    Часы в строке статуса



    ...

    ...
    либо .

    Типы данных
    Как и любой другой язык программирования, JavaScript поддерживает встроенные структуры и типы данных. Все их многообразие подразделяется на:
    • литералы;
    • переменные;
    • массивы;
    • функции;
    • объекты.
    При этом все они делятся на встроенные и определяемые программистом. Функции и объекты будут рассмотрены в дельнейшем.

    Литералы
    Литералом называют данные, которые используются в программе непосредственно. При этом под данными понимаются числа или строки текста. Все они рассматриваются в JavaScript как элементарные типы данных. Приведем примеры литералов:
    числовой литерал: 10
    числовой литерал: 2.310
    числовой литерал: 2.3e+2
    строковый литерал: 'Это строковый литерал'
    строковый литерал: "Это строковый литерал"
    Литералы используются в операциях присваивания значений переменным или в операциях сравнения:
    var a=10;
    var str = 'Строка';
    if(x=='test') alert(x);

    Оператор присваивания ( переменная = выражение ) возвращает результат вычисления выражения, поэтому ничто не мешает полученное значение присвоить еще и другой переменной. Таким образом, последовательность операторов присваивания выполняется справа налево:

    result = x = 5+7;

    Два варианта строковых литералов необходимы для того, чтобы использовать вложенные строковые литералы. Если в строковом литерале требуется использовать одинарную кавычку, то сам литерал можно заключить в двойные кавычки: "It's cool!". Верно и обратное. Но если есть необходимость использовать в строковом литерале оба вида кавычек, то проще всего всех их "экранировать" символом обратной косой черты \, при этом саму строку можно заключить в любую пару кавычек. Например: команда:
    document.write("It\'s good to say \"Hello\" to someone!");
    выдаст:
    It's good to say "Hello" to someone!

    Помимо строковых литералов (последовательностей символов, заключенных в кавычки) есть еще строковые объекты; они создаются конструктором: var s = new String(). У этого объекта существует много методов (об объектах и методах пойдет речь в следующей лекции). Следует понимать, что строковый литерал и строковый объект - далеко не одно и то же. Но зачастую мы этого не замечаем, т.к. при применении к строчным литералам методов строчных объектов происходит преобразование первых в последние. Например, можно сначала присвоить var s='abra-kadabra', а затем применить метод: var m=s.split('b'), который неявно преобразует строковый литерал s в строковый объект и затем разбивает строку в тех местах, где встречается подстрока 'b', возвращая массив строк-кусков: массив m будет состоять из строк 'a', 'ra-kada' и 'ra' (массивы рассматриваются ниже).

    Переменные
    Переменная - это область памяти, имеющая свое имя и хранящая некоторые данные. Переменные в JavaScript объявляются с помощью оператора var, при этом можно давать или не давать им начальные значения:

    var k;
    var h='Привет!';

    Можно объявлять сразу несколько переменных в одном операторе var (тем самым уменьшая размер кода), но тогда их надо писать через запятую. При этом тоже можно давать или не давать начальные значения:

    var k, h='Привет!';
    var t=37, e=2.71828;

    Тип переменной определяется по присвоенному ей значению. Язык JavaScript - слабо типизирован: в разных частях программы можно присваивать одной и той же переменной значения различных типов, и интерпретатор будет "на лету" менять тип переменной. Узнать тип переменной можно с помощью оператора typeof():


    var i=5;

    alert(typeof(i));

    i= new Array();

    alert(typeof(i));

    i= 3.14;

    alert(typeof(i));

    i=

    'Привет!';

    alert(typeof(i));

    i=

    window.open(); alert(typeof(i));


    Переменная, объявленная оператором var вне функций, является глобальной - она "видна" всюду в скрипте. Переменная, объявленная оператором var внутри какой-либо функции, является локальной - она "видна" только в пределах этой функции. Подробнее о функциях будет рассказано в следующем разделе этой лекции.
    Например, в следующем фрагменте ничего не будет выведено на экран, несмотря на то, что мы обращаемся к переменной k после описания функции, и даже после ее вызова:


    function f()
    { var k=5; } f(); alert(k);
    Причина в том, что переменная k является локальной, и она существует только в процессе работы функции f(), а по окончании ее работы уничтожается.
    Если имеется глобальная переменная k, а внутри функции объявляется локальная переменная с тем же именем (оператором var k ), то это будет другая переменная, и изменение ее значения внутри функции никак не повлияет на значение глобальной переменной с тем же именем. Например, этот скрипт выдаст 7, поскольку вызов функции f() не затронет значения глобальной переменной k:

    var k=7;

    function f()
    { var k=5; } f(); alert(k);
    То же касается и аргументов при описании функций (с той лишь разницей, что перед ними не нужно ставить var ): если имеется глобальная переменная k, и мы опишем функцию function f(k) {...}, то переменная k внутри {...} никак не связана с одноименной глобальной переменной. В этом плане JavaScript не отличается от других языков программирования.
    Примечание. Объявлять переменные можно и без оператора var, просто присваивая переменной начальное значение. Так зачастую делают с переменными циклов. В следующем примере, даже если переменная i не была объявлена ранее, все будет работать корректно:

    for(i=0; i<8; i++) { ... }

    Однако опускать var не рекомендуется. Во-первых, это нарушает ясность кода: если написано i=5, то непонятно, вводится ли здесь новая переменная или меняется значение старой. Во-вторых, и это главное, нужно помнить следующий момент, часто приводящий к неправильной работе программы.
    Вне функций объявление переменной без оператора var равносильно объявлению с оператором var - в обоих случаях переменная будет глобальной. Внутри же функции объявление переменной без оператора var делает переменную глобальной (а не локальной, как можно было бы предположить), и значит, ее значение могут "видеть" и менять другие функции или операторы вне этой функции. При этом такая переменная становится глобальной не после описания, а после вызова этой функции.
    Пример:
    function f()
    { var i=5; k=7; } f(); alert(k);
    В приведённом примере после i=5 стоит точка с запятой (а не запятая). Значит, k=7 - это отдельное объявление переменной, уже без оператора var. Поэтому переменная k "видна" снаружи и ее значение ( 7 ) будет выведено оператором alert(k). Чтобы скрыть переменную k, нужно было после i=5 поставить запятую.
    Рассмотрим другой пример, показывающий, к каким неожиданным последствиям может привести отсутствие var при описании переменной:
    function f(i)
    { k=7; if(i==3) k=5;

    else { f(3); alert(k); }
    }
    f(0);

    Мы вызываем f(0), переменной присваивается значение k=7, далее выполнение функции идет по ветке else - и оператор alert(k) выдает 5 вместо ожидавшегося 7. Причина в том, что вызов f(3) в качестве "побочного эффекта" изменил значение k. Чтобы такого не произошло, нужно перед k=7 поставить var. Тогда переменная k будет локальной и вызов f(3) не сможет ее изменить, так как при вызове функции создаются новые копии всех ее локальных переменных.
    При написании больших программ подобные ошибки трудно отследить, поэтому настоятельно рекомендуется все переменные объявлять с оператором var, особенно внутри функций.
    Массивы
    Массивы делятся на встроенные ( document.links[], document.images[] и т.п. - их еще называют коллекциями ) и определяемые пользователем (автором документа). Мы подробно остановимся на массивах, определяемых пользователем. Для массивов определено несколько методов: join(), reverse(), sort() и другие, а также свойство length, которое позволяет получить число элементов массива.
    Для определения массива пользователя существует специальный конструктор Array. Если ему передается единственный аргумент, причем целое неотрицательное число, то создается незаполненный массив соответствующей длины. Если же передается один аргумент, не являющийся числом, либо более одного аргумента, то создается массив, заполненный этими элементами:
    a = new Array();


    • пустой массив (длины 0)

    b = new Array(10);


    • массив длины 10

    c = new Array(10,'Привет');


    • массив из двух элементов: числа и строки

    d = [5, 'Тест', 2.71828, 'Число e'];


    • краткий способ создать массив из 4 элементов



    Элементы массива нумеруются с нуля. Поэтому в последнем примере значение d[0] равно 5, а значение d[1] равно 'Тест'. Как видим, массив может состоять из разнородных элементов. Массивы не могут быть многомерными, однако ничто не мешает завести массив, элементами которого будут тоже массивы.


    Метод join()
    Метод join() позволяет объединить элементы массива в одну строку. Он является обратным к методу split(), который разрезает объект типа String на куски и составляет из них массив. Кстати, метод split() демонстрирует тот факт, что массив можно получить и без конструктора массива.
    Рассмотрим пример преобразования локального URL в глобальный URL, где в качестве адреса сервера будет выступать www.yoursite.com. Пусть в переменной localURL хранится локальный URL некоторого файла:
    localURL = "file:///C:/yoursite/2/2.html"

    Разрежем строку в местах вхождения комбинации символов " :/ ", выполнив команду: b = localURL.split(':/'). Получим массив:
    b[0] = "file";
    b[1] = "//C";
    b[2] = "yourpages/2/2.html";
    Заменяем 0-й и 1-й элементы на требуемые:
    b[0] = "http:";
    b[1] = "/www.yoursite.com";
    Наконец, склеиваем полученный массив, вставляя косую черту в местах склейки: globalURL = b.join("/"). В итоге мы получаем требуемый глобальный URL - значение globalURL будет равно: http://www.yoursite.com/yourpages/ 2/2.html

    Метод reverse()
    Метод reverse() применяется для изменения порядка элементов массива на противоположный. Предположим, массив упорядочен следующим образом:
    a = new Array('мать','видит','дочь');
    Упорядочим его в обратном порядке, вызвав метод a.reverse(). Тогда новый массив a будет содержать:
    a[0]='дочь';
    a[1]='видит';
    a[2]='мать';

    Метод sort()
    Метод sort() интерпретирует элементы массива как строковые литералы и сортирует массив в алфавитном (т.н. лексикографическом) порядке. Обратите внимание: метод sort() меняет массив. В предыдущем примере, применив a.sort(), мы получим на выходе:
    a[0]='видит';
    a[1]='дочь';
    a[2]='мать';

    Однако, это неудобно, если требуется отсортировать числа, поскольку согласно алфавитному порядку 40 идет раньше чем 5. Для этих целей у метода sort() имеется необязательный аргумент, являющийся именем функции, согласно которой требуется отсортировать массив, т.е. в этом случае вызов метода имеет вид: a.sort(myfunction). Эта функция должна удовлетворять определенным требованиям:
    - у нее должно быть ровно два аргумента;
    - функция должна возвращать число;
    - если первый аргумент функции должен считаться меньшим (большим, равным) чем второй аргумент, то функция должна возвратить отрицательное (положительное, ноль) значение.
    Например, если нам требуется сортировать числа, то мы можем описать следующую функцию:
    function compar(a,b)
    {
    if(a < b) return -1;
    if(a > b) return 1;
    if(a == b) return 0;
    }

    Теперь, если у нас есть массив b = new Array(10,6,300,25,18);, то можно сравнить результаты сортировки без аргумента и с функцией compar в качестве аргумента:
    document.write("Алфавитный порядок:
    ");
    document.write(b.sort());
    document.write("
    Числовой порядок:
    ");
    document.write(b.sort(compar));
    В результате выполнения этого кода получим следующее:
    Алфавитный порядок:
    10,18,25,300,6
    Числовой порядок:
    6,10,18,25,300
    Обратите внимание: метод sort() интерпретирует элементы массива как строки (и производит лексикографическую сортировку), но не преобразует их в строки. Если в массиве были числа, то они числами и останутся. В этом легко убедиться, если в конце последнего примера выполнить команду document.write(b[3]+1): результат будет 26 (т.е. 25+1 ), а не 251 (т.е. "25"+"1" ).


    Операторы языка
    В этом разделе будут рассмотрены операторы JavaScript. Основное внимание при этом мы уделим операторам декларирования и управления потоком вычислений. Без них не может быть написана ни одна JavaScript-программа.
    Общий перечень этих операторов выглядит следующим образом (сразу оговоримся, что этот список неполный):
    {...}
    if ... else ...
    ()?
    while
    for
    break

    continue
    return
    {...}
    Фигурные скобки определяют составной оператор JavaScript - блок . Основное назначение блока - определение тела цикла, тела условного оператора или функции.

    if ... else ...
    Условный оператор применяется для ветвления программы по некоторому логическому условию. Есть два варианта синтаксиса:
    if (логическое_выражение) оператор;
    if (логическое_выражение) оператор_1; else оператор_2;

    Логическое выражение - это выражение, которое принимает значение true или false. В первом варианте синтаксиса: если логическое_выражение равно true, то выполняется указанный оператор. Во втором варианте синтаксиса: если логическое_выражение равно true, то выполняется оператор_1, если же оно равно false оператор_2. Пример использования (об объекте navigator читай лекцию ):

    if (navigator.javaEnabled())
    alert('Ваш браузер поддерживает Java'); else
    alert('Ваш браузер НЕ поддерживает Java');


    ()?
    Этот оператор, называемый условным выражением, выдает одно из двух значений в зависимости от выполнения некоторого условия. Синтаксис его таков:
    (логическое_выражение)? значение_1 : значение_2
    Если логическое_выражение равно true, то возвращается значение_1, в противном случае значение_2. Условное выражение легко имитируется оператором if...else, однако оно позволяет сделать более компактным и легко воспринимаемым код программы. Например, следующие два фрагмента равносильны:

    TheFinalMessage = (k>5)? 'Готово!' : 'Подождите...';
    if(k>5) TheFinalMessage = 'Готово!';
    else TheFinalMessage = 'Подождите...';


    while
    Оператор while задает цикл. Определяется он в общем случае следующим образом:
    while (условие_продолжения_цикла) тело_цикла;
    Тело цикла может быть как простым, так и составным оператором. Составной оператор, как всегда, заключается в фигурные скобки. Рекомендуется и простой оператор заключать в них, чтобы программу можно было легко модифицировать. Условие_продолжения_цикла является логическим выражением. Тело исполняется до тех пор, пока верно логическое условие. Формально, цикл while работает следующим образом:
    1. проверяется условие_продолжения_цикла:
    если оно ложно ( false ), цикл закончен,
    если же истинно ( true ), то продолжаем далее;
    2. выполняется тело_цикла ;
    3. переходим к пункту 1.

    Такой цикл используется, когда заранее неизвестно количество итераций, например, в ожидании некоторого события. Пример:
    var s='';
    while (s.length<6)
    {
    s=prompt('Введите строку длины не менее 6:','');
    }
    alert('Ваша строка: ' + s + '. Спасибо!');


    for
    Оператор for - это еще один оператор цикла. В общем случае он имеет вид:
    for (инициализация_переменных_цикла;
    условие_продолжения_цикла;
    модификация_переменных_цикла) тело_цикла;
    Тело цикла может быть как простым, так и составным оператором (составной необходимо заключать в фигурные скобки). Операторы инициализация_переменных_цикла и модификация_переменных_цикла могут состоять из нескольких простых операторов, в этом случае простые операторы должны быть разделены запятой. Условие_продолжения_цикла является логическим выражением. Цикл for работает следующим образом:

    выполняется инициализация_переменных_цикла ;
    1. проверяется условие_продолжения_цикла:
    если оно ложно ( false ), цикл закончен,
    если же истинно ( true ), то продолжаем далее;

    2. выполняется тело_цикла ;
    3. выполняется модификация_переменных_цикла ;
    4. переходим к пункту 2.
    Рассмотрим типичный пример использования этого оператора:
    document.write('Кубы чисел от 1 до 100:');
    for (n=1; n<=100; n++)
    document.write('
    '+n+'3 = '+ Math.pow(n,3));

    Здесь Math - встроенный объект, предоставляющий многочисленные математические константы и функции, а Math.pow(n,m) вычисляет степенную функцию nm. Результат работы скрипта получите самостоятельно.


    break
    Оператор break позволяет досрочно покинуть тело цикла. Возвращаясь к нашему примеру с кубами чисел, распечатаем только кубы, не превышающие 5000.

    document.write('Кубы чисел, меньшие 5000:'); for (n=1; n<=100; n++) {
    s=Math.pow(n,3);
    if(s>5000) break;
    document.write('
    '+n+'3 = '+s);
    }

    Несмотря на то, что переменную n мы заставили пробегать от 1 до 100, т.е. заведомо с запасом, реально же цикл выполнится для значений n от 1 до ...
    получите сами!
    continue
    Оператор continue позволяет перейти к следующей итерации цикла, пропустив выполнение всех нижестоящих операторов в теле цикла. Если нам нужно вывести кубы чисел от 1 до 100, превышающие 10 000, то мы можем составить такой цикл:
    document.write('Кубы чисел от 1 до 100, большие 10 000:');

    for (n=1; n<=100; n++)
    {
    s=Math.pow(n,3);
    if(s <= 10000) continue;

    document.write('
    '+n+'3 = '+s);
    }
    Проверьте самостоятельно, кубы каких чисел будут выведены скриптом. Разумеется, для большей гибкости можно использовать в циклах оба оператора break и continue.

    return
    Оператор return используют для возврата значения из функции или обработчика события. Рассмотрим пример с функцией:

    function sign(n)
    {
    if (n>0) return 1;
    if (n<0) return -1;
    return 0;
    }
    alert( sign(-3) );
    Обратите внимание: оператор return не только указывает, какое значение должна вернуть функция, но и прекращает выполнение дальнейших операторов в теле функции.
    При использовании в обработчиках событий оператор return позволяет отменить или не отменять действие по умолчанию, которое совершает браузер при возникновении данного события. Отменить его, однако, можно не для всех событий. Рассмотрим пример:

    onClick="alert('Не отправим!');return false;">


    В этом примере без оператора return false пользователь увидел бы окно предупреждения "Не отправим!" и далее был бы перенаправлен на страницу newpage.html. Оператор же return false позволяет отменить отправку формы, и пользователь лишь увидит окно предупреждения.
    Аналогично, чтобы отменить действие по умолчанию для параметров событий onClick, onKeyDown, onKeyPress, onMouseDown, onMouseUp, onSubmit, onReset, нужно использовать return false. Для события onMouseOver с этой же целью нужно использовать оператор return true. Для некоторых же событий, например onMouseOut, onLoad, onUnload, отменить действие по умолчанию невозможно.
    Функции
    Язык программирования не может обойтись без механизма многократного использования кода программы. Такой механизм обеспечивается процедурами или функциями. В JavaScript функция выступает в качестве одного из основных типов данных. Одновременно с этим в JavaScript определен класс объектов Function.


    • общем случае любой объект JavaScript определяется через функцию. Для создания объекта используется конструктор, который в свою очередь вводится через Function. Таким образом, с функциями в JavaScript связаны следующие ключевые вопросы:


    1) функция как тип данных;
    2) функция как объект;
    3) функция как конструктор объектов.
    Именно эти вопросы мы и рассмотрим в данном разделе.

    Функция как тип данных
    Определяют функцию при помощи ключевого слова function:
    function f(arg1,arg2,...)
    {
    /* тело функции */
    }

    Здесь следует обратить внимание на следующие моменты. Во-первых, function определяет переменную с именем f. Эта переменная имеет тип function:

    document.write('Тип переменной f: '+ typeof(f));


    • Будет выведено: Тип переменной f: function


    Во-вторых, эта переменная, как и любая другая, имеет значение


    • свой исходный текст: var i=5;

    function f(a,b,c)
    {
    if (a>b) return c;
    }
    document.write('Значение переменной i: '+ i.valueOf());



    • Будет выведено:




    • Значение переменной i: 5



    document.write('Значение переменной f:
    '+ f.valueOf());



    • Будет выведено:




    • Значение переменной f:




    • function f(a,b,c)




    • {




    • if (a>b) return c;




    • }


    Как видим, метод valueOf() применим как к числовой переменной i, так и к переменной f, и возвращает их значение. Более того, значение переменной f можно присвоить другой переменной, тем самым создав "синоним" функции f:
    function f(a,b,c)
    {
    if (a>b) return c;
    else return c+8;
    }

    var g = f;
    alert('Значение f(2,3,2): '+ f(2,3,2) );
    alert('Значение g(2,3,2): '+ g(2,3,2) );

    • Будет выведено:




    • Значение f(2,3,2): 10




    • Значение g(2,3,2): 10



    Этим приемом удобно пользоваться для сокращения длины кода. Например, если нужно много раз вызвать метод document.write(), то можно ввести переменную: var W = document.write (обратите внимание - без скобок!), а затем вызывать: W('

    Лекция

    ').
    Коль скоро функцию можно присвоить переменной, то ее можно передать и в качестве аргумента другой функции.

    function kvadrat(a)
    { return a*a; }

    function polinom(a,k)
    { return k(a)+a+5;}

    alert(polinom(3,kvadrat));


    • Будет выведено: 17



    Все это усиливается при использовании функции eval(), которая в качестве аргумента принимает строку, которую рассматривает как последовательность операторов JavaScript (блок) и выполняет этот блок. В качестве иллюстрации приведем скрипт, который позволяет вычислять функцию f(f(...f(N)...)), где число вложений функции f() задается пользователем.




    Введите аргумент (число):


    Сколько раз возвести его в квадрат?


    onClick="alert(SuperPower());">

    Обратите внимание на запись L=R=''. Она выполняется справа налево. Сначала происходит присваивание R=''. Операция присваивания выдает в качестве результата значение вычисленного выражения (в нашем случае - пустая строка). Она-то и присваивается далее переменной L.

    Поясним работу скрипта в целом. В функции SuperPower() мы сначала считываем значения, введенные в поля формы, и преобразуем их из строк в целые числа функцией parseInt(). Далее с помощью цикла for мы собираем строку L, состоящую из K копий строки " kvadrat( ", и строку R, состоящую из K правых скобок " ) ". Теперь мы составляем выражение L+N+R, представляющее собой K раз вложенную в себя функцию kvadrat(), примененную к аргументу N. Наконец, с помощью функции eval() вычисляем полученное выражение. Таким образом, вычисляется функция (...((N)2)2...)2.

    Функция как объект
    У любого типа данных JavaScript существует объектовая "обертка" (wrapper), которая позволяет применять методы типов данных к переменным и литералам, а также получать значения их свойств. Например, длина строки символов определяется свойством length. Аналогичная "обертка" есть и у функций - это класс объектов Function.
    Например, увидеть значение функции можно не только при помощи метода valueOf(), но и используя метод toString():
    function f(x,y)
    {
    return x-y;
    }
    document.write(f.toString());
    Результатраспечатки:
    function f(x,y) { return x-y; }
    Свойства же функции как объекта доступны программисту только тогда, когда они вызываются внутри этой функции. Наиболее часто используемыми свойствами являются: массив (коллекция) аргументов функции
    ( arguments[] ), его длина ( length ), имя функции, вызвавшей данную функцию ( caller ), и прототип ( prototype ).

    Рассмотрим пример использования списка аргументов функции и его длины:
    function my_sort()
    {
    a = new Array(my_sort.arguments.length); for(i=0;ia[i] = my_sort.arguments[i]; return a.sort();
    }
    b = my_sort(9,5,7,3,2);
    document.write(b);


    • Будет выдано: 2,3,5,7,9


    Чтобы узнать, какая функция вызвала данную функцию, используется свойство caller. Возвращаемое ею значение имеет тип function. Пример:

    function s()
    { document.write(s.caller+"
    "); }

    function M()
    { s(); return 5; }

    function N()
    { s(); return 7; } M(); N();
    Результат исполнения:
    function M() { s(); return 5; }
    function N() { s(); return 7; }

    Еще одним свойством объекта класса Function является prototype. Но это - общее свойство всех объектов, не только функций, поэтому и обсуждать его мы будем в следующем разделе в контексте типа данных Object. Упомянем только о конструкторе объекта класса Function:
    f = new Function(arg_1,...,arg_n, body)
    Здесь f - это объект класса Function (его можно использовать как обычную функцию), arg _1, ..., arg_n - аргументы функции f, а body - строка, задающая тело функции f.
    Данный конструктор можно использовать, например, для описания функций, которые назначают или переопределяют методы объектов. Здесь мы вплотную подошли к вопросу конструирования объектов. Дело в том, что переменные внутри функции можно рассматривать в качестве ее свойств, а функции - в качестве методов:
    function Rectangle(a,b,c,d)
    {
    this.x0 = a;
    this.y0 = b;
    this.x1 = c;
    this.y1 = d;
    this.area = new Function(
    "return Math.abs((this.x1-this.x0)*(this.y1-this.y0))");
    }
    r = new Rectangle(0,0,30,50);

    document.write("Площадь: "+r.area());



    • Будет выведено:




    • Площадь: 1500



    Обратите внимание еще на одну особенность - ключевое слово this. Оно позволяет сослаться на текущий объект, в рамках которого происходит исполнение JavaScript-кода. В данном случае это объект класса Rectangle.
    Контрольные вопросы по JavaScript:
    1. Что такое JavaScript?

    2. В чём заключается основная идея JavaScript?

    3. Назовите 4 способа функционального применения JavaScript.

    4. Что такое схема URL?

    5. Можно ли в URL размещать сложные программы и вызовы функций?

    6. Где указываются обработчики событий?

    7. Что такое контейнер Script?

    8. Каким образом можно поместить Java-script код на HTML странице с помощью контейнера Script?

    9. Как указать язык скрипта? Какой язык считается по умолчанию?

    10. Является ли JavaScript регистрозависимым языком?

    11. Какие типы данных поддерживает язык JavaScript?

    12. Что такое литерал?

    13. Для чего необходимы 2 варианта строковых литералов?

    14. Чем отличаются глобальные и локальные переменные?

    15. Для чего нужен оператор var?

    16. На какие 2 типа делятся массивы в JavaScript?

    17. Для чего нужен метод join()?

    18. Для чего нужен метод reverse()?

    19. Для чего нужен метод sort()?

    20. Без каких операторов не может быть написана ни одна программа JavaScript?

    21. Для чего нужен условный оператор if… else…? Как он работает?

    22. Для чего нужен оператор ()? Как он работает?

    23. Как работает цикл while()?

    24. Как работает цикл for()?

    25. Как работают операторы break и continue?

    26. Для чего нужен оператор return?

    27. Какие ключевые вопросы связаны с функциями в JavaScript?

    Содержание отчёта
    1. Титульный лист.

    2. Постановка задачи.

    3. Код динамических элементов интерфейса.

    4. Ответы на контрольные вопросы (не обязательно).

    5. Вывод.

    Оглавление

    Цель………………………………………………………………………………………стр.1

    Задачи…………………………………………………………………………………….стр.1

    Теоретические сведения………………………………………………………………...стр.1

    Контрольные вопросы…………………………………………………………………стр.33

    Содержание отчёта…………………………………………………………………….стр.34




    написать администратору сайта