Явасрипт JavaScript

[habr] Приключенческая игра, в которую играют путем изменения её Javascript-кода
Надо помочь герою преодолеть более 20 уровней, в процессе прохождения которых мы встретим боевых дронов, реки и лабиринты, ключи и замки, звонки «оператору Матрицы» и многое другое… К счастью, благодаря взломанному компьютеру у главного героя есть доступ к коду игры! И если на первых уровнях мы просто изменяем на ходу реальность, то в конце нам придется запускать в нее свои js-объекты, помогающие атаковать мега-босса.

(*на основе hexlet.org)
LISP/scheme (почти) с C-синтаксисом (почти)
Нестрогая типизация (переменная не обязана объявляться -- без явного описания типа)
Прототипно-ориентированный (наследуют свои черты от других объектов, хотя можно сделать из него и классовый язык при желании)
Сценарный (scripting)
Чаще всего используется в браузерах

JavaScript -- это язык браузера.

"Самый неправильно понятный язык программирования в мире стал самым популярным в мире языком программировния" Дуглас Крокфорд (евангелист языка JavaScript).
"JavaScript: The Good Parts" -- книга Дугласа Крокфорда (рекоммендовано и без воды)

Чаще всего даже программисты плохо представляют что такое JavaScripta.

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

JS ужасен, но на самом деле нет.

Факт: JS доминирует в интернете.

__

Объект -- это контейнер со свойствами.
Функция -- объект, Массив -- объект.

Эта простая идея, что почти все является объектом, дает очень много возможностей.


var obj = {};

var person = {
"name" : "Alex",
"age" : 25
};

Обращение к объекту:

person.name
person.age

или:

person["name"]

Объект может содержать в себе объект, например:

var person = {
name : Alex,

wife : {
name : Eve,
age: 24
},
age : 25
};

> person.wife.age => 24

Обновить/добавить данные в объекте:

person.name = "David"
person.height = 178

Прототипы
Это одна из основных идей яваскрипта.

Новый объект может наследовать у родительского прототипа свойства. А также иметь свои.
Если обновить прототип, во всех дочерних элементах это свойство появится (важно).

Как создать прототип:

var char = Object.create(person); //person является прототипом для char

Удаление свойства из объекта:
delete person.name; (если есть прототип с этим свойством -- будет возвращено оно)

__
Функции и Замыкания
http://jsfiddle.net/ -- удобный инструмет попробвать написать небольшие программы.
repl.it -- cодержит интерпритаторы различных языков программирования

Функция является объектом.
У функций есть встоенные свойства: name, length (количество параметров), prototype
Функциям можно задать свойства и методы.
Можно создавать функции внутри функций (это клево).

У функции может не быть имени -- анонимная функция.

This
This -- это один из параметров, который доступен внутри функции, но явно никак не виден.

var obj = {
base : 13,
average : function (x, y) {
return (this.base+x+y)/3;
};
};

если нет подобных свойст -- также происходит их поиск по всем родительским прототипам.

параметры описываются в скобках функции.
аргументы (arguments) -- это те параметры, которые вы передаете при вызове функции (их может быть также больше или меньше, чем парамтеров)

Область видимости (внутри блока замкнутая область видимости -- недоступна вне этого блока. так работают c++, java)
в JS такого ограничения нет.
НО: все переменные внутри функции доступны внутри функции и НЕ доступны вне функции (это единственный способ ограничить область видимости в JS)&

console.log -- выводит текст на консоль (как в браузерных иснтрументах (firebag), так и напрямую в консоли, например в node.js)

Можно задать функцию и сразу ее вызывать:

a = 10;
( function() { console.lof(a); } ) ();

НО, если сделать так:
( function() { console.lof(a); var = 11; } ) ();

выдаст "underfind"

Это связано с Variable Hosting -- где бы вы не объявляли в теле функции переменные, их декларация всегда поднимается на самый верх, до операторов внутри функции.

Значит: всегда описывать переменные в самом начале функции.

Замыкания (closures)
Одна из самых важных вещей в JS (реализована очень хорошо)

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

__
Замыкания в джаваскрипте
Декларативное программирование