Javascript.RU

Структура javascript

В этом разделе рассмотрена общая структура и синтаксис javascript-кода с учетом основных особенностей языка.

Он очень тесно связан с разделом сайта Основные элементы языка. Вы можете читать и то и другое в удобной вам последовательности.

Стандарт (формальное описание синтаксиса и работы языка) javascript называется ECMAScript. На нем, кстати, основан не только javascript, но и несколько других языков, например ActionScript (Flash).

По ECMAScript есть спецификация, которая подробно описывает синтаксис, управляющие конструкции и базовые объекты языка.

Например, вот скрипт, который работает, используя только ECMAScript. Кстати, поэтому он будет работать и в других языках, основанных на ECMAScript, включая ActionScript:

var max = 5
try {
  for(var i=0; i<Number.POSITIVE_INFINITY; i++) {
    if (i>max) throw new Error("failed to reach the stars")
  }
} catch(e) { }

ECMAScript - и правда очень особенный язык. Особенно для тех, кто пришел из PHP, C, Java. В нем особым образом устроены объекты и функции.

Здесь мы пройдем по основным особенностям и отличиям языка.

Как и во многих языках, предложения на языке javascript можно разделять точкой с запятой.

Но при переходе на новую строку в javascript точка с запятой становится необязательна, ее можно не ставить.

Эти две строки полностью эквивалентны:

a = 5
a = 5;
В javascript перевод строки подразумевает точку с запятой.

В частности, многие новички сталкиваются с ошибками при многострочных присваиваниях и вызовах.

Вот так не будет работать:

var a = "длинная 
  строка "

Так как перевод строки подразумевает точку с запятой, и javascript поймет это как

var a = "длинная;
  строка ";

То есть, сообщит о незавершенной строке (unterminated literal) в первой строчке этого примера.

Или, например, следующие два примера кода эквивалентны:

return
  result;

тоже самое, что и

return;
result;

и совсем не то же, что

return result

В обоих случаях будет возвращено значение undefined (это значение возвращает любая функция, где нет оператора return, либо оператор return вызван без аргумента), а не result.

Чтобы многострочные операторы работали как надо - перенос строки можно указывать обратным слешем "\", вот так:

var a = "длинная \
  строка "

return \
   result;

Полный список синтаксических конструкций и операторов приведен в справочнике. Они похожи на PHP/C/Java, но многие имеют особенности, знание которых поможет грамотно программировать на javascript.

Блоки задаются фигурными скобками.

Локальные переменные объявляются при помощи var. Причем, в отличие от C/Java, сам по себе блок не задает отдельную область видимости.

var i = 0
{
  var i=5
  alert(i) // 5 
}
alert(i) // тоже 5

Комментарии возможны в двух вариантах // и /*...*/:

// однострочные комментарии 

/* 
   многострочные
   комментарии
*/

Переменные в javascript слабо типизированы. Это означает, что при объявлении не нужно указывать тип. Можно присвоить любой переменной любое значение.

Однако при этом интерпретатор javascript (браузер) всегда знает, какого типа значение содержит данная переменная, а значит - какие операции к ней применимы.

Переменную не обязательно объявлять. Достаточно ее просто присвоить:

x = 5

Далее мы разберем основные типы переменных и действия с ними.

Функции задаются объявлением function со списком параметров:

function sayHello(name) {
    alert("Hello "+name)
}

Язык javascript предоставляет очень мощные возможности по работе с функциями.

Например:

Директива var при объявлении переменной делает ее локальной, то есть видимой только внутри текущей функции. Все остальные переменные являются глобальными.

Локальная переменная объявляется так:

var i

При объявлении можно тут же присвоить переменной значение и объявить другие переменные:

var a=5, b=6, str = "Строка"

В следующем примере переменная a в функции go объявлена как локальная. Поэтому глобальное значение a=1 не изменяется в процессе выполнения go.

a = 1
function go() {
    var a = 6
}

go()
alert(a) // => 1

А здесь - ключевое слово var опущено, поэтому значение меняется:

a = 1
function go() {
    a = 6
}

go()
alert(a) // => 6

Кстати, глобальных переменных в javascript на самом деле нет. То, что называют "глобальными" - на самом деле свойства специального объекта window. Например, в последнем примере alert(window.a) тоже выдало бы 6.

Все "глобальные" переменные привязаны к своему окну. Разные окна и фреймы имеют разные "глобальные" переменные, которыми могут обмениваться друг с другом.

Вообще, глобальных переменных в JS рекомендуется избегать, особенно при написании библиотек и компонент, которые предполагается использовать в разных приложениях.

Как правило - всё, что относится к компоненту, объявляется в виде свойств единого глобального объекта: ExtJS, dojo и т.п. Вы можете увидеть это в любом известном JS-фреймворке.

Для объявления строк используются кавычки - простые ' или двойные ". Между ними нет никакой разницы.

a = 'моя'
b = "строка"

Для конкатенации строк используется оператор +.

a = "моя"
b = "строка"
alert(a + ' ' + b)

Более подробно строки и другие базовые типы рассмотрены в статье Базовые типы: Строки, Числа, Boolean.

Javascript - объектный язык. В нем все является объектами. Строки, числа, функции и массивы - все это объекты со своими методами и свойствами. Это надо знать и иметь в виду с самого начала.

Методы объектов вызываются через точку. Например, у строки String есть метод toUpperCase, возвращающий строку в верхнем регистре:

name = "Vasya"

alert( name.toUpperCase() )

Или даже так:

alert( "Vasya".toUpperCase() )

Практически всё в javascript делается при помощи вызова методов различных объектов.

Объекты создаются функциями-конструкторами при помощи директивы new.
Вы можете почитать о них подробнее в разделе Объекты, ООП

В javascript есть два основных способа объявить массив.

Для массива с числовыми индексами обычно используется объект типа Array.

arr = new Array("my", "array")
alert(arr.length)  // 2

Свойство length содержит длину массива, которая всегда равна последнему индексу (в примере выше - это 1) плюс один.

Обычно используется другая, почти эквивалентная, запись массива, использующая квадратные скобки:

arr = [ "my", "array" ]
alert(arr[0]) // "my" <- нумерация от нуля

Новые элементы можно добавить в конец методом push.
Для перебора значений используется цикл for.

arr = ["первый", "второй"]
arr.push("третий")

for(var i=0; i<arr.length; i++) {
  alert(arr[i]) 
}

Более подробно массивы с числовыми индексами рассмотрены в статье Массивы .

Для массивов, ключи которых являются строками, используется Object.
Следующая запись задает ассоциативный массив с ключами n и str:

obj = { 
  n: 1,
  str: "Вася"
}

Для получения свойства объекта используется оператор-аксессор: точка либо квадратные скобки.

obj = {   n: 1,  str: "Вася" }

alert(obj.n) // точка 
alert(obj["n"])

Квадратные скобки позволяют получать свойство по переменной-ключу.

var key = "str"
alert(obj[key])

Точка используется, если имя свойства точно известно. Вызов obj.key вернет свойство по имени "key", а квадратные скобки - по значению, которое содержится в переменной key.

При обращении к отсутствующему свойству возвращается специальное значение undefined.

a = { }  // пустой объект
alert(a.something)  // undefined
alert(a.blabla === undefined)

В примере был использован оператор сравнения без приведения типа.

Более подробно о том, как перебирать ключи массива, и о самих объектах - вы можете узнать из статьи Объекты Javascript в примерах.

Более подробно обо всем этом можно почитать в разделе сайта Основные элементы языка.

  • Вы разобрали основы языка javascript.
  • Узнали, какие базовые типы в нем есть
  • Ознакомились с синтаксисом функций и заданием переменных в javascript
  • Освоили основные операции с числовыми и ассоциативными массивами

Очень хорошо, если вы нашли возможность прочитать статьи по ссылкам.
Впрочем, чтобы двигаться дальше - хватит и материала в этой статье.

Еще по теме:

Автор: Гость (не зарегистрирован), дата: 22 сентября, 2009 - 12:54
#permalink

Мне кажется, что одна из самых ключевых фраз

"Javascript - объектный язык. В нем все является объектами. Это надо знать и иметь в виду с самого начала."

нуждается в более подробной расшифровке.

Я наверно раза три или четыре перечитывал разные разделы учебника, пока наконец понял, что все переменные "простых" типов в JS - также объекты. Просто многие переменные типа String или Array объявляются неявно без директивы new.


Автор: Aiaks (не зарегистрирован), дата: 23 сентября, 2009 - 15:17
#permalink

Прекрасная статья, всё кратко, чётко и понятно. Побольше такие статей...
респект автору!


Автор: Дмитрий aka XPLORER (не зарегистрирован), дата: 17 ноября, 2009 - 15:12
#permalink

Здравствуйте!

Хотел бы уточнить для тех кто не понял, строка:

var a=5, b=6, str = "Строка"

Создает локальную переменную "a", и две глобальных "b" и "str".
Поэтому использовать такую конструкцию внутри функции крайне не рекомендуется.

Спасибо, хорошая статья.


Автор: Regent, дата: 11 января, 2010 - 14:36
#permalink

Дмитрий, все переменные в этом примере - локальные.


Автор: Саня2002 (не зарегистрирован), дата: 19 ноября, 2009 - 11:40
#permalink

Автор-молодец....Кстати, нет полной электронной версии данных статей?


Автор: Гость (не зарегистрирован), дата: 10 февраля, 2010 - 00:20
#permalink
alert(11);

Автор: Гость (не зарегистрирован), дата: 24 февраля, 2010 - 15:24
#permalink

автар создал лцчший рускоязычный ресурс по теме! вот электронный вариант бы тож хотелосьбы в комнить стареньком chm)))


Автор: возжаждавший, дата: 24 февраля, 2010 - 17:13
#permalink

ВСем привет, вопрос такой, там в статье есть код

var i = 0
{
  var i=5
  alert(i) // 5 
}
alert(i) // тоже 5

Оба раза выводится 5, как и написано в комментариях. И вот здесь большой СТОП!!!.
Друзья! Цитата автора
"Директива var при объявлении переменной делает ее локальной, то есть видимой только внутри текущей функции."

Сие означает, что второе var i=5 создал и инициаровало переменную i, которая видима ТОЛЬКО ВНУТРИ фигурных скобок
Отсюда крайне непонятно, когда переменная i, созданная при ПЕРВОМ объявлении и инициализированная нулём, стала равной пяти (что мы наблюдаем при втором вызове alert(i))

Крайне непонятно. Извините.
...РАзобрался. Мне, систу, и неводомёк было, что такая консрукция
var i = 6
var i
в javascript вполне себе корректна. Может, кому-то пойдёт на пользу сия крайне важная денталь для тех, тем более. кто пришёл из других языков.


Автор: B@rmaley.e><e, дата: 24 февраля, 2010 - 17:20
#permalink

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


Автор: Илья Кантор, дата: 25 февраля, 2010 - 00:20
#permalink

Если подробнее - интерпретатор javascript обрабатывает все объявления var в функции один раз - условно говоря, при входе в функцию.

Например, в следующем коде присваивание a=5 относится к локальной переменной. Несмотря на то, что объявление var идет ниже, оно(как и все остальные var) обрабатывается при входе в функцию.

window.a = 0
function f() {
  a = 5 // установит локальную переменную

 var a
 
 alert(a) // 5
 alert(window.a) // 0
}
f()

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
16 + 3 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Статьи и мероприятия

Будьте в курсе наших последних новостей!

Ответьте, пожалуйста..
О чем бы вы хотели услышать на конференции по javascript?

На какие темы послушать доклады? Конференция состоится в середине мая.


Последние обсуждения на форуме
Forum
Последние комментарии