28
JavaScript Intro пожалуй начать стоит именно с этого

JavaScript Intro

  • Upload
    -

  • View
    237

  • Download
    0

Embed Size (px)

Citation preview

Page 1: JavaScript Intro

JavaScript Introпожалуй начать стоит именно с этого

Page 2: JavaScript Intro

Немного истории (Brendan Eich)JS был обязан «выглядеть как Java», только поменьше, быть эдаким младшим братом-тупицей для Java. Кроме того, он должен был быть написан за 10 дней, а иначе мы бы имели что-то похуже JS.

В то время мы должны были двигаться очень быстро, т.к. знали, что Microsoft идет за нами.

10 дней на то, чтобы сделать лексер, парсер, компилятор в байткод (bytecode emitter), интерпретатор, встроенные классы и декомпилятор. Помощь была только с файлом jsdate.c — от Ken Smith из Netscape (который, по нашему излишне оптимистичному соглашению, склонировал java.util.Date — Y2K баги и т.д. тупица...).

Считайте, что JavaScript (пожалуйста, только не «JScript») спас вас от VBScript.

Простите, времени было мало для того, чтобы сделать правильную оптимизацию хвостовой рекурсии. 10 дней почти без сна, чтобы сделать JS с чистого листа, заставить его «выглядеть как Java» (я сделал, чтобы он выглядел как C), и тайком протащить туда его спасительные фишки: first class functions (замыкания сделал позже, но они были частью плана сразу) и прототипы (примерно как в языке Self).

I'll do better in the next life.

Page 3: JavaScript Intro

Еще чуть-чуть

«Самый неправильно понятый язык программирования в мире стал самым популярным в мире языком программирования»

Дуглас Крокфорд

Первоначально язык назывался LiveScript и предназначался как для программирования на стороне клиента, так и для программирования на стороне сервера (там он должен был называться LiveWire).

На синтаксис оказали влияние языки Си и Java, и, поскольку Java в то время было модным словом, 4 декабря 1995 года LiveScript переименовали в JavaScript, получив соответствующую лицензию у Sun.

Page 4: JavaScript Intro

и еще..

Анонс JavaScript со стороны представителей Netscape и Sun состоялся накануне выпуска второй бета-версии Netscape Navigator. В нём декларируется, что 28 лидирующих ИТ-компаний выразили намерение использовать в своих будущих продуктах JavaScript как объектный скриптовый язык с открытым стандартом.

По инициативе компании Netscape была проведена стандартизация языка ассоциацией ECMA. Стандартизированная версия имеет название ECMAScript, описывается стандартом ECMA-262. Первой версии спецификации соответствовал JavaScript версии 1.1, а также языки JScript и ScriptEasy.

Page 5: JavaScript Intro

будет ли видна 'a' в коде исполняющемся в контексте глобального объекта?

a)a = 1;

b)var a = 1;

c)function(){

a = 1;}

d)var b = function (){

var a = 1;}

Page 6: JavaScript Intro

будет ли видна 'a' в коде исполняющемся в контексте глобального объекта?

a)a = 1;Да.

b)var a = 1;Да.

c)function(){

a = 1;}Да.

d)var b = function (){

var a = 1;}Нет

Page 7: JavaScript Intro

что выведется в консоль?a)function a(){

return “hello”;}console.log(a);

b)var a = function(){ return “hello” };console.log(a());

c)var a = ( function(b){ return b; } )(“hello”);console.log(a);

d)var a = (function(b){ return b;})(“hello”);console.log( a() );

Page 8: JavaScript Intro

что выведется в консоль?a)function a(){

return “hello”;}console.log(a);Выведется код функции “a”. То же самое что и при вызрове a.toString();

b)var a = function(){ return “hello” };console.log(a());Выведется “hello”

c)var a = ( function(b){ return b; } )(“hello”);console.log(a);Выведется “hello”

d)var a = (function(b){ return b;})(“hello”);console.log( a() );Вызовет ошибку string не функция.

Page 9: JavaScript Intro

что выведется в консоль при вызове abc(); ?

var a = 234;function abc(){

console.log(typeof a);var a = ‘line’;

}

Page 10: JavaScript Intro

что выведется в консоль при вызове abc(); ?

var a = 234;function abc(){

console.log(typeof a);var a = ‘line’;

}

Выведется undefined.

Page 11: JavaScript Intro

почему этот код не работает так как от него “ожидают”?

function User(name) { this.name = name;};

var j = User('Jack');alert(j.name);

(ожидают что j отработает как конструктор)

Page 12: JavaScript Intro

почему этот код не работает так как от него “ожидают”?

function User(name) { this.name = name;};

var j = User('Jack');alert(j.name);

Ожидают от него что в j окажется объектом создаваемый контруктором User, но так как User вызван без new, а User ничего не возвращает j будет undefined, а обращение к j.name вызовет TypeError.

Page 13: JavaScript Intro

что выведет код? Почему?

Object.prototype.hello = {};var a = [1,2,3];for ( var number in a ) { alert( number );}

Page 14: JavaScript Intro

что выведет код? Почему?

Object.prototype.hello = {};var a = [1,2,3];for ( var number in a ) { alert( number );}

Код поочередно выведет четыре сообщения, в первом - 0, во втором - 1, в третьем - 2 и в четвертом выведет hello. Это происходит потому что в JavaScript массив это также объект, а for .. in выражение проходит по всем свойствам объекта. Таким свойством является и hello. В number у нас помещаются названия свойств при обходе объекта.

Page 15: JavaScript Intro

что выведет код? Почему?

(function() { var pack = 'Jack'; })(); alert(typeof pack);

Page 16: JavaScript Intro

что выведет код? Почему?

(function() { var pack = 'Jack'; })(); alert(typeof pack);

Выведет undefined, т.к. pack не определен, т.к. определение pack происходит локально, и никак не влияет на глобальный объект, в контексте которого мы вызываем alert();

Page 17: JavaScript Intro

что выведет код? Почему?

function SuperConstructor() { this.x = 20; this.getX = function() { return this.x; }}var a = new SuperConstructor();var f = a.getX;console.log(f());

Page 18: JavaScript Intro

что выведет код? Почему?

function SuperConstructor() { this.x = 20; this.getX = function() { return this.x; }}var a = new SuperConstructor();var f = a.getX;console.log(f());

f выполняется в глобальном контексте, а не контексте объекта созданного конструктором SuperConstructor, но f это ссылка на a.getX, поэтому вернет this.x, что тоже самое что и f.x, который undefined.

Page 19: JavaScript Intro

а этот?

x = 5;function SuperConstructor() { this.x = 20; this.getX = function() { return this.x; }}var a = new SuperConstructor();var f = a.getX;console.log(f());

Page 20: JavaScript Intro

что выведет код? Почему?

x=[];for (var i = 0; i < 3; ++i) {

var j = i;x.push(function () { return j; });

}console.log(x[0](), x[1](), x[2]());

Page 21: JavaScript Intro

что выведет код? Почему?

x=[];for (var i = 0; i < 3; ++i) {

var j = i;x.push(function () { return j; });

}console.log(x[0](), x[1](), x[2]());

В x будет три элемента, все они будут функциями возвращающими 2, т.к. вызываются они в когда j = 2

Page 22: JavaScript Intro

что делать?

x = [];for (var i = 0; i < 3; ++i){

(function (new_i) {x.push(function () { return new_i; });

})(i);}

Page 23: JavaScript Intro

что делать?

x = [];for (var i = 0; i < 3; ++i){

(function (new_i) {x.push(function () { return new_i; });

})(i);}т.о. в x будет три функции каждая из которых будет возвращать свой индекс в x.

Page 24: JavaScript Intro

что выведет код? Почему?

for(var i=0;i<5;i++) {setTimeout(function(){

alert(i);}, 0);

}

Page 25: JavaScript Intro

что выведет код? Почему?

for(var i=0;i<5;i++) {setTimeout(function(){

alert(i);}, 0);

}

JavaScript-код исполняется в одном потоке (event loop, UI thread). setTimeout, откладывает выполнение функции на 0 мс. НО. Событие таймаута произойдет только тогда, когда основной поток освободится - цикл пройдет полностью. Код выведет 5 пятёрок. Почему пятёрок? :)

Page 26: JavaScript Intro

где применим JavaScript?

На сервере

На клиенте

Page 27: JavaScript Intro

Что будет дальше с JavaScript?

Новые спецификации языка - новые языковые структуры (ES6)

Новые спецификации от W3C - новые возможности (HTML5, Canvas, Video, WebIntents, WebWorkers, WebSockets , WebDriver, WebAudio, WebGL, Notifications API etc)

Новые продукты - большее распространение, новые возможности

Page 28: JavaScript Intro

[email protected], skype:arudevich

Спасибо.

Дальше - вопросы и определение тем будущих митапов - больше :) оптимизация, поддержка, новьё etc