SlideShare a Scribd company logo
1 of 90
JavaScript 
Александр Березневатый, 
Senior Java Developer & Team Lead
> new Array() + new Array() = ?
> new Array() + new Array() = ‘’
> new Array() + new Array() = “ 
> new Array() + new Object() = ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object]
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ => true 
> 0 == false ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ => true 
> 0 == false => true 
> '0' == false ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ => true 
> 0 == false => true 
> '0' == false => true 
> 0 == ' r t n t ‘ ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ => true 
> 0 == false => true 
> '0' == false => true 
> 0 == ' r t n t ‘ => true 
> NaN == NaN ?
> new Array() + new Array() = “ 
> new Array() + new Object() = [object Object] 
> 0 == ‘’ => true 
> 0 == ‘0’ => true 
> 0 == false => true 
> '0' == false => true 
> 0 == ' r t n t ‘ => true 
> NaN == NaN => false
План дня 
> История Web (продолжение) 
> Синтаксис 
> Работа с DOM 
> Good Parts & Bad Parts 
> Libraries 
> Performance notes 
> Домашнее задание
Цели 
> Общее понимание языка 
> Часто встречающиеся сложности 
> Заинтересовать в изучении 
> Best practice
Жалобы 
> Программирование в браузере это ужас 
> JS тормозит 
> я плохо знаю JS 
> JS просто большая куча ошибок
История: JavaScript 
> Разработан за две недели 
> Много чего бездумно скопировано 
> Пострадал в результате войны браузеров 
> Стандартизируется ECMA + W3C
Синтаксис
Синтаксис: Объекты 
> неупорядоченный набор свойств 
> var x = new Object() 
> var y = {};
Синтаксис: JSON 
> очень краткий и емкий формат 
> {}, [] 
> свойства в кавычках
Синтаксис: JSON 
{ 
“status” : “success” 
“result” : [ 
12, 22, { “id”: 45, “name”: “Alex” } 
] 
}
Синтаксис: Функции 
> функция тоже объект 
> ключевое слово function 
> аргументы и локальные переменные
Синтаксис: Функции 
var myFunc = function(arg0, arg1) { 
arguments[0] === arg0;//true 
arguments[2] === 3;//true 
}; 
myFunc(1, 2, 3);
Синтаксис: Функции 
function iter(fn, array) { 
for (var i = 0; i < array.length; i++) { 
fn(array[i]); 
} 
}; 
iter(function(el){ 
alert(el); 
}, 
[1, 2, 3, 4]);
Синтаксис: Глобальный контекст 
> глобальные переменные это свойства 
объекта window 
> ключевое слово var 
> ключевое слово delete
Синтаксис: Видимость переменных 
> ключевое слово var (продолжение) 
> цепочки скоупов 
> ключевое слово with
Синтаксис: Видимость переменных
Синтаксис: Контекст 
> ключевое слово this 
> варианты контекста 
> методы call и apply
Синтаксис: Контекст 
function myFunc() { 
console.log(this); 
} 
var obj = { method : myFunc }; 
myFunc(); // this === window 
obj.method(); // this === obj 
obj.method.call(document); // this === document 
obj.method.apply(console); // this === console
Синтаксис: Прототипы и наследование 
> наследуются объекты 
> цепочки свойств 
> перезапись и удаление свойств
Синтаксис: Прототипы и наследование 
var x = { 
name: ‘Alex’ 
}; 
var y = {}; 
assert(y.name === undefined); 
y.prototype = x; 
assert(y.name === x.name); 
y.name = ‘Sasha’; 
assert(y.name === ‘Sasha’); 
assert(x.name === ‘Alex’);
Синтаксис: Прототипы и наследование 
var JSProgrammer = { 
skills: ‘javascript’ 
}; 
var LuxoftJsProgrammer = function(name, city) { 
this.name = name; 
this.city = city || ‘unknown’; 
}; 
LuxoftJsProgrammer.prototype = JSProgrammer; 
var me = new LuxoftJsProgrammer(‘Alex’); 
assert(me instanceof LuxoftJsProgrammer);
Синтаксис: Прототипы и наследование
Синтаксис: Прототипы и наследование
Синтаксис: Прототипы и наследование
Синтаксис: eval() == evil 
> вызывется в той же области видимости 
> хуже по производительности 
> потенциальная дыра в безопасности 
> используйте заменители когда это возможно
Синтаксис: strict mode 
> "use strict"; 
> запрещает «скрытые» ошибки 
> улучшает безопасность кода 
> не разрешает пользоваться 
«неправильными» инструментами
Синтаксис: Вопросы
Работа с DOM
Document 
> <div id=“myElementId”/> 
> document.getElementById(“myElementId”); 
> document.getElementsByTagName(“div”); 
> xpath
Live collections 
var divs = document.getElementsByTagName(“div”); 
for (var i = 0; i < divs.length; i++) { 
var el = divs[i]; 
el.parentNode.removeChild(el);// хитрая ошибка 
}
Node 
> Document, Element, TextNode 
> appendChild/removeChild 
> firstChild/lastChild 
> childNodes 
> getAttribute/setAttribute
Window 
> setTimeout/clearTimeout 
> концепция кадров 
> Некоторый контроль над браузером 
> alert/confirm/prompt
События 
> addEventListener/attachEvent 
> фазы просачивания и перехвата 
> удаление обработчиков 
> не используйте html аттрибуты!
События
События 
function on(el, event, fn) { 
if (el.addEventListener) { 
el.addEventListener(event, fn, false); 
} else if (el.attachEvent) { 
el.attachEvent(‘on’ + event, fn); 
} else { 
// выдать ошибку – странный браузер 
} 
} 
on(element, ‘click’, function() { 
alert(‘Hi’); 
});
События 
element.addEventListener(‘click’, function() { 
alert(‘hi’); 
}, false); 
// … 
// скрытая ошибка 
element.removeEventListener(‘click’, function() { 
alert(‘hi’); 
}, false);
События 
var listener = function() { 
alert(‘hi’); 
}; 
element.addEventListener(‘click’, listener, false); 
// … 
element.removeEventListener(‘click’, listener, false);
Стили 
> element.style.borderBottom = “1px solid red”; 
> document.defaultView (хорошие браузеры) 
> element.currentStyle (только IE)
Reflow 
for (var i = 0; i < array.length; i++) { 
element.innerHTML += array[i]; // возможен reflow 
if (element.offsetWidth > 50) { // тут уж точно reflow 
// do something 
} 
}
AJAX 
> Asynchronous JavaScript And XML 
> Баги и особенности в разных браузерах 
> Используйте библиотечные реализации
Comet 
> server push 
> Периодически опрашиваем сервер 
> Помним о висячих соединениях
DOM: Вопросы
Best practices
Bad parts 
> Глобальные переменные 
> Оператор + 
> typeof 
> with и eval 
> Ложные массивы 
> == и != 
> false, null, undefined, NaN 
> Автоматическая вставка ;
Bad parts 
function myFunc() { 
return { 
ok: true 
}; 
}
Bad parts 
function myFunc() { 
return 
{ 
ok: false 
}; 
}
Bad parts 
function myFunc() { 
return; // упс 
{ 
ok: false 
}; 
}
Bad parts 
function myFunc() { 
return; 
{ // блок 
ok: false 
}; 
}
Bad parts 
function myFunc() { 
return; 
{ 
ok: false // label 
}; 
}
Bad parts 
function myFunc() { 
return; 
{ 
ok: false // бессмысленный оператор 
}; 
}
Bad parts 
function myFunc() { 
return; 
{ 
ok: false; 
}; 
}
Bad parts 
function myFunc() { 
return; 
{ 
ok: false; 
}; // пустой оператор 
}
Bad parts 
function myFunc() { 
return; 
// код недостижим, но JS промолчит 
{ 
ok: false; 
}; 
}
Bad parts
Good parts 
> функции, замыкания 
> операторы || и && 
> JSON, {}, [] 
> динамические объекты и типы 
> JSLint
Good parts
Патерны: локальная глобальность 
(function(window, undefined) { 
var document = window.document, 
navigator = window.navigator, 
location = window.location; 
// ваш код 
}) (window);
Патерны: синглетон 
var singleton = (function() { 
var privateVar = 3; 
return { 
publicFn: function(arg) { 
return arg + privateVar; 
} 
}; 
}) (); 
singleton.publicFn(5);
Патерны: callback 
Array.prototype.each = function(fn) { 
for (int i = 0; i < this.length; i++) { 
fn.call(this, this[i], i); 
} 
}; 
var myNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; 
myNumbers.each(function(el, i) { 
// this === myNumbers 
});
Патерны: условные операторы 
function(arg1, arg2) { 
var name = arg1 || arg2 || ‘unknown’; 
// вместо: 
var other = arg1; 
if (!other) { 
other = arg2; 
} 
if (!other) { 
other = ‘unknown’; 
} 
}
Патерны: длинный список параметров 
// кривовато: 
function fn(arg1,arg2, arg3, arg4, arg5, arg6 …); 
// лучше: 
function fn(cfg) { 
cfg.arg1, cfg.arg2… 
} 
fn({ 
arg1: ‘ss’ 
});
Патерны: полиморфные функции 
function ajax(url, fn) { 
var method = ‘get’; 
if (typeof(url) !== ‘string’) { 
method = url.method; 
fn = url.fn; url = url.url; 
} 
// do ajax … 
} 
ajax(‘myUrl’, myCallback); 
ajax({ 
method: ‘post’, 
url: ‘myUrl’, 
fn: myCallback 
});
Патерны: цепочечные вызовы 
var obj = { 
initialize : function() { 
return this; 
}, 
animate : function() { 
return delayController; 
} 
}; 
obj.initialize().animate().oncomplete(function(){ 
// работа по завершению анимации 
});
Performance 
> контролируйте reflow 
> помните о живых колекциях 
> осторожно работайте с DOM 
> пользуйтесь DocumentFragment 
> используйте локальные переменные 
> сжимайте свой код обфускатором
Отладка 
> FireBug, Draggonfly, WebInspector 
> IE: Visual Studio, Companion.JS, DebugBar 
> debugger 
> console.log() 
> Старые добрые window.alert()
Best Practices: Вопросы
Libraries: JQuery 
> Легковесная, простая, мощная 
> Основана на селекторах близких к CSS 
> Практикует «ненавязчивость»
Libraries: JQuery 
$(“#myButtonId”).click( function(){ 
$.ajax(“/myActionUrl”).done(function(response) { 
var el = $(“<div>”); 
el.html(response); 
$(“#results”).append(el); 
}); 
});
Libraries: ExtJS 
> Тяжелая библиотека компонентов 
> Легка в освоении 
> Хорошая архитектура 
> Много компонентов out-of-box
Libraries: ExtJS 
Ext.create('Ext.window.Window', { 
title: 'Hello', 
height: 200, 
width: 400, 
layout: 'fit', 
items: { 
xtype: 'grid', 
border: false, 
columns: [{header: 'World'}], 
store: Ext.create('Ext.data.ArrayStore', {}) 
} 
}).show();
Libraries 
> Dojo 
> Prototype 
> SmartClient 
> GWT
Что упустили? 
> Наследование (подробнее) 
> Детали синтаксиса 
> Система типов 
> Многое другое
Что почитать? 
> Дэвид Флэнаган: JavaScript. Подробное руководство 
> JavaScript: The Good Parts. Douglas Crockford 
> High Performance JavaScript. Nicholas C. Zakas 
> http://jonraasch.com/blog/10-javascript-performance-boosting- 
tips-from-nicholas-zakas 
> http://learn.jquery.com/ 
> https://developer.mozilla.org/ru/ 
> http://w3fools.com
Что посмотреть? 
> The Good Parts. http://www.youtube.com/watch? 
v=hQVTIJBZook 
> Speed up you javascript 
http://www.youtube.com/watch?v=mHtdZgou0qU 
> 10 things I’ve learned from jquery source 
http://www.youtube.com/watch?v=i_qE1iAmjFg
Вопросы
Домашнее задание 
> прикручиваем джаваскрипт к нашему 
toprankу 
> используем JQuery

More Related Content

What's hot

Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyEvgeny Kompaniyets
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьYandex
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9Technopark
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...Ontico
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Web осень 2012 лекция 9
Web осень 2012 лекция 9Web осень 2012 лекция 9
Web осень 2012 лекция 9Technopark
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6Dmitry Soshnikov
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
Что API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновЧто API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновYandex
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)Anton Bukov
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьYandex
 

What's hot (20)

Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря Groovy
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. Асинхронность
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
Yii development
Yii developmentYii development
Yii development
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Web осень 2012 лекция 9
Web осень 2012 лекция 9Web осень 2012 лекция 9
Web осень 2012 лекция 9
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
Что API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновЧто API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон Корзунов
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
 
MongoDB@addconf
MongoDB@addconfMongoDB@addconf
MongoDB@addconf
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: Асинхронность
 

Similar to Подробная презентация JavaScript 6 в 1

Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуAndreyGeonya
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9Technopark
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 
Нетривиальная обработка ошибок
Нетривиальная обработка ошибокНетривиальная обработка ошибок
Нетривиальная обработка ошибокoelifantiev
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CSergey Pronin
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentationIvan Filimonov
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)Mikhail Davydov
 
JavaScript. Async (in Russian)
JavaScript. Async (in Russian)JavaScript. Async (in Russian)
JavaScript. Async (in Russian)Mikhail Davydov
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxYandex
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jqueryITmozg
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15MoscowJS
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...solit
 

Similar to Подробная презентация JavaScript 6 в 1 (20)

Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
 
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
 
course js day 2
course js day 2course js day 2
course js day 2
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
Нетривиальная обработка ошибок
Нетривиальная обработка ошибокНетривиальная обработка ошибок
Нетривиальная обработка ошибок
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-C
 
JavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программированияJavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программирования
 
FPUG Dzyga presentation
FPUG Dzyga presentationFPUG Dzyga presentation
FPUG Dzyga presentation
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
 
JavaScript. Async (in Russian)
JavaScript. Async (in Russian)JavaScript. Async (in Russian)
JavaScript. Async (in Russian)
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Scala for android
Scala for androidScala for android
Scala for android
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
course js day 4
course js day 4course js day 4
course js day 4
 

More from Vasya Petrov

Настройка Apache и PHP
Настройка Apache и PHPНастройка Apache и PHP
Настройка Apache и PHPVasya Petrov
 
Создание сайта на PHP
Создание сайта на PHPСоздание сайта на PHP
Создание сайта на PHPVasya Petrov
 
Графика средствами PHP
Графика средствами PHPГрафика средствами PHP
Графика средствами PHPVasya Petrov
 
Графика средствами PHP
Графика средствами PHPГрафика средствами PHP
Графика средствами PHPVasya Petrov
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотекаVasya Petrov
 
Оптимизация CSS
Оптимизация CSSОптимизация CSS
Оптимизация CSSVasya Petrov
 
Основные теги HTML
Основные теги HTMLОсновные теги HTML
Основные теги HTMLVasya Petrov
 
Работа с текстом в HTML
Работа с текстом в HTMLРабота с текстом в HTML
Работа с текстом в HTMLVasya Petrov
 
Rabota s massivami_v_php
Rabota s massivami_v_phpRabota s massivami_v_php
Rabota s massivami_v_phpVasya Petrov
 
Rabota so strokami_v_php
Rabota so strokami_v_phpRabota so strokami_v_php
Rabota so strokami_v_phpVasya Petrov
 
Внедрение CSS в HTML документ
Внедрение CSS в HTML документВнедрение CSS в HTML документ
Внедрение CSS в HTML документVasya Petrov
 
CSS Язык описания представлений
CSS Язык описания представленийCSS Язык описания представлений
CSS Язык описания представленийVasya Petrov
 
массивы Php
массивы Phpмассивы Php
массивы PhpVasya Petrov
 
Таблицы Html
Таблицы HtmlТаблицы Html
Таблицы HtmlVasya Petrov
 

More from Vasya Petrov (20)

О школе
О школеО школе
О школе
 
Настройка Apache и PHP
Настройка Apache и PHPНастройка Apache и PHP
Настройка Apache и PHP
 
Создание сайта на PHP
Создание сайта на PHPСоздание сайта на PHP
Создание сайта на PHP
 
Графика средствами PHP
Графика средствами PHPГрафика средствами PHP
Графика средствами PHP
 
Графика средствами PHP
Графика средствами PHPГрафика средствами PHP
Графика средствами PHP
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотека
 
Оптимизация CSS
Оптимизация CSSОптимизация CSS
Оптимизация CSS
 
633942
633942633942
633942
 
Основные теги HTML
Основные теги HTMLОсновные теги HTML
Основные теги HTML
 
Работа с текстом в HTML
Работа с текстом в HTMLРабота с текстом в HTML
Работа с текстом в HTML
 
Rabota s massivami_v_php
Rabota s massivami_v_phpRabota s massivami_v_php
Rabota s massivami_v_php
 
Rabota so strokami_v_php
Rabota so strokami_v_phpRabota so strokami_v_php
Rabota so strokami_v_php
 
Внедрение CSS в HTML документ
Внедрение CSS в HTML документВнедрение CSS в HTML документ
Внедрение CSS в HTML документ
 
Tables frames
Tables framesTables frames
Tables frames
 
CSS Язык описания представлений
CSS Язык описания представленийCSS Язык описания представлений
CSS Язык описания представлений
 
массивы Php
массивы Phpмассивы Php
массивы Php
 
Таблицы Html
Таблицы HtmlТаблицы Html
Таблицы Html
 
еще JavaScript
еще JavaScriptеще JavaScript
еще JavaScript
 
JavaScript
JavaScriptJavaScript
JavaScript
 
Html списки
Html спискиHtml списки
Html списки
 

Подробная презентация JavaScript 6 в 1

  • 2.
  • 3. > new Array() + new Array() = ?
  • 4. > new Array() + new Array() = ‘’
  • 5. > new Array() + new Array() = “ > new Array() + new Object() = ?
  • 6. > new Array() + new Array() = “ > new Array() + new Object() = [object Object]
  • 7. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ ?
  • 8. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ ?
  • 9. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ => true > 0 == false ?
  • 10. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ => true > 0 == false => true > '0' == false ?
  • 11. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ => true > 0 == false => true > '0' == false => true > 0 == ' r t n t ‘ ?
  • 12. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ => true > 0 == false => true > '0' == false => true > 0 == ' r t n t ‘ => true > NaN == NaN ?
  • 13. > new Array() + new Array() = “ > new Array() + new Object() = [object Object] > 0 == ‘’ => true > 0 == ‘0’ => true > 0 == false => true > '0' == false => true > 0 == ' r t n t ‘ => true > NaN == NaN => false
  • 14.
  • 15. План дня > История Web (продолжение) > Синтаксис > Работа с DOM > Good Parts & Bad Parts > Libraries > Performance notes > Домашнее задание
  • 16. Цели > Общее понимание языка > Часто встречающиеся сложности > Заинтересовать в изучении > Best practice
  • 17. Жалобы > Программирование в браузере это ужас > JS тормозит > я плохо знаю JS > JS просто большая куча ошибок
  • 18.
  • 19. История: JavaScript > Разработан за две недели > Много чего бездумно скопировано > Пострадал в результате войны браузеров > Стандартизируется ECMA + W3C
  • 20.
  • 22. Синтаксис: Объекты > неупорядоченный набор свойств > var x = new Object() > var y = {};
  • 23. Синтаксис: JSON > очень краткий и емкий формат > {}, [] > свойства в кавычках
  • 24. Синтаксис: JSON { “status” : “success” “result” : [ 12, 22, { “id”: 45, “name”: “Alex” } ] }
  • 25. Синтаксис: Функции > функция тоже объект > ключевое слово function > аргументы и локальные переменные
  • 26. Синтаксис: Функции var myFunc = function(arg0, arg1) { arguments[0] === arg0;//true arguments[2] === 3;//true }; myFunc(1, 2, 3);
  • 27. Синтаксис: Функции function iter(fn, array) { for (var i = 0; i < array.length; i++) { fn(array[i]); } }; iter(function(el){ alert(el); }, [1, 2, 3, 4]);
  • 28. Синтаксис: Глобальный контекст > глобальные переменные это свойства объекта window > ключевое слово var > ключевое слово delete
  • 29. Синтаксис: Видимость переменных > ключевое слово var (продолжение) > цепочки скоупов > ключевое слово with
  • 31. Синтаксис: Контекст > ключевое слово this > варианты контекста > методы call и apply
  • 32. Синтаксис: Контекст function myFunc() { console.log(this); } var obj = { method : myFunc }; myFunc(); // this === window obj.method(); // this === obj obj.method.call(document); // this === document obj.method.apply(console); // this === console
  • 33. Синтаксис: Прототипы и наследование > наследуются объекты > цепочки свойств > перезапись и удаление свойств
  • 34. Синтаксис: Прототипы и наследование var x = { name: ‘Alex’ }; var y = {}; assert(y.name === undefined); y.prototype = x; assert(y.name === x.name); y.name = ‘Sasha’; assert(y.name === ‘Sasha’); assert(x.name === ‘Alex’);
  • 35. Синтаксис: Прототипы и наследование var JSProgrammer = { skills: ‘javascript’ }; var LuxoftJsProgrammer = function(name, city) { this.name = name; this.city = city || ‘unknown’; }; LuxoftJsProgrammer.prototype = JSProgrammer; var me = new LuxoftJsProgrammer(‘Alex’); assert(me instanceof LuxoftJsProgrammer);
  • 36. Синтаксис: Прототипы и наследование
  • 37. Синтаксис: Прототипы и наследование
  • 38. Синтаксис: Прототипы и наследование
  • 39. Синтаксис: eval() == evil > вызывется в той же области видимости > хуже по производительности > потенциальная дыра в безопасности > используйте заменители когда это возможно
  • 40. Синтаксис: strict mode > "use strict"; > запрещает «скрытые» ошибки > улучшает безопасность кода > не разрешает пользоваться «неправильными» инструментами
  • 43. Document > <div id=“myElementId”/> > document.getElementById(“myElementId”); > document.getElementsByTagName(“div”); > xpath
  • 44. Live collections var divs = document.getElementsByTagName(“div”); for (var i = 0; i < divs.length; i++) { var el = divs[i]; el.parentNode.removeChild(el);// хитрая ошибка }
  • 45. Node > Document, Element, TextNode > appendChild/removeChild > firstChild/lastChild > childNodes > getAttribute/setAttribute
  • 46. Window > setTimeout/clearTimeout > концепция кадров > Некоторый контроль над браузером > alert/confirm/prompt
  • 47. События > addEventListener/attachEvent > фазы просачивания и перехвата > удаление обработчиков > не используйте html аттрибуты!
  • 49. События function on(el, event, fn) { if (el.addEventListener) { el.addEventListener(event, fn, false); } else if (el.attachEvent) { el.attachEvent(‘on’ + event, fn); } else { // выдать ошибку – странный браузер } } on(element, ‘click’, function() { alert(‘Hi’); });
  • 50. События element.addEventListener(‘click’, function() { alert(‘hi’); }, false); // … // скрытая ошибка element.removeEventListener(‘click’, function() { alert(‘hi’); }, false);
  • 51. События var listener = function() { alert(‘hi’); }; element.addEventListener(‘click’, listener, false); // … element.removeEventListener(‘click’, listener, false);
  • 52. Стили > element.style.borderBottom = “1px solid red”; > document.defaultView (хорошие браузеры) > element.currentStyle (только IE)
  • 53. Reflow for (var i = 0; i < array.length; i++) { element.innerHTML += array[i]; // возможен reflow if (element.offsetWidth > 50) { // тут уж точно reflow // do something } }
  • 54. AJAX > Asynchronous JavaScript And XML > Баги и особенности в разных браузерах > Используйте библиотечные реализации
  • 55. Comet > server push > Периодически опрашиваем сервер > Помним о висячих соединениях
  • 58. Bad parts > Глобальные переменные > Оператор + > typeof > with и eval > Ложные массивы > == и != > false, null, undefined, NaN > Автоматическая вставка ;
  • 59. Bad parts function myFunc() { return { ok: true }; }
  • 60. Bad parts function myFunc() { return { ok: false }; }
  • 61. Bad parts function myFunc() { return; // упс { ok: false }; }
  • 62. Bad parts function myFunc() { return; { // блок ok: false }; }
  • 63. Bad parts function myFunc() { return; { ok: false // label }; }
  • 64. Bad parts function myFunc() { return; { ok: false // бессмысленный оператор }; }
  • 65. Bad parts function myFunc() { return; { ok: false; }; }
  • 66. Bad parts function myFunc() { return; { ok: false; }; // пустой оператор }
  • 67. Bad parts function myFunc() { return; // код недостижим, но JS промолчит { ok: false; }; }
  • 69. Good parts > функции, замыкания > операторы || и && > JSON, {}, [] > динамические объекты и типы > JSLint
  • 71. Патерны: локальная глобальность (function(window, undefined) { var document = window.document, navigator = window.navigator, location = window.location; // ваш код }) (window);
  • 72. Патерны: синглетон var singleton = (function() { var privateVar = 3; return { publicFn: function(arg) { return arg + privateVar; } }; }) (); singleton.publicFn(5);
  • 73. Патерны: callback Array.prototype.each = function(fn) { for (int i = 0; i < this.length; i++) { fn.call(this, this[i], i); } }; var myNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; myNumbers.each(function(el, i) { // this === myNumbers });
  • 74. Патерны: условные операторы function(arg1, arg2) { var name = arg1 || arg2 || ‘unknown’; // вместо: var other = arg1; if (!other) { other = arg2; } if (!other) { other = ‘unknown’; } }
  • 75. Патерны: длинный список параметров // кривовато: function fn(arg1,arg2, arg3, arg4, arg5, arg6 …); // лучше: function fn(cfg) { cfg.arg1, cfg.arg2… } fn({ arg1: ‘ss’ });
  • 76. Патерны: полиморфные функции function ajax(url, fn) { var method = ‘get’; if (typeof(url) !== ‘string’) { method = url.method; fn = url.fn; url = url.url; } // do ajax … } ajax(‘myUrl’, myCallback); ajax({ method: ‘post’, url: ‘myUrl’, fn: myCallback });
  • 77. Патерны: цепочечные вызовы var obj = { initialize : function() { return this; }, animate : function() { return delayController; } }; obj.initialize().animate().oncomplete(function(){ // работа по завершению анимации });
  • 78. Performance > контролируйте reflow > помните о живых колекциях > осторожно работайте с DOM > пользуйтесь DocumentFragment > используйте локальные переменные > сжимайте свой код обфускатором
  • 79. Отладка > FireBug, Draggonfly, WebInspector > IE: Visual Studio, Companion.JS, DebugBar > debugger > console.log() > Старые добрые window.alert()
  • 81. Libraries: JQuery > Легковесная, простая, мощная > Основана на селекторах близких к CSS > Практикует «ненавязчивость»
  • 82. Libraries: JQuery $(“#myButtonId”).click( function(){ $.ajax(“/myActionUrl”).done(function(response) { var el = $(“<div>”); el.html(response); $(“#results”).append(el); }); });
  • 83. Libraries: ExtJS > Тяжелая библиотека компонентов > Легка в освоении > Хорошая архитектура > Много компонентов out-of-box
  • 84. Libraries: ExtJS Ext.create('Ext.window.Window', { title: 'Hello', height: 200, width: 400, layout: 'fit', items: { xtype: 'grid', border: false, columns: [{header: 'World'}], store: Ext.create('Ext.data.ArrayStore', {}) } }).show();
  • 85. Libraries > Dojo > Prototype > SmartClient > GWT
  • 86. Что упустили? > Наследование (подробнее) > Детали синтаксиса > Система типов > Многое другое
  • 87. Что почитать? > Дэвид Флэнаган: JavaScript. Подробное руководство > JavaScript: The Good Parts. Douglas Crockford > High Performance JavaScript. Nicholas C. Zakas > http://jonraasch.com/blog/10-javascript-performance-boosting- tips-from-nicholas-zakas > http://learn.jquery.com/ > https://developer.mozilla.org/ru/ > http://w3fools.com
  • 88. Что посмотреть? > The Good Parts. http://www.youtube.com/watch? v=hQVTIJBZook > Speed up you javascript http://www.youtube.com/watch?v=mHtdZgou0qU > 10 things I’ve learned from jquery source http://www.youtube.com/watch?v=i_qE1iAmjFg
  • 90. Домашнее задание > прикручиваем джаваскрипт к нашему toprankу > используем JQuery

Editor's Notes

  1. 12/6/14 &amp;lt;number&amp;gt;
  2. 12/6/14 &amp;lt;number&amp;gt;
  3. 12/6/14 &amp;lt;number&amp;gt;
  4. 12/6/14 &amp;lt;number&amp;gt;
  5. 12/6/14 &amp;lt;number&amp;gt;
  6. 12/6/14 &amp;lt;number&amp;gt;
  7. 12/6/14 &amp;lt;number&amp;gt;
  8. 12/6/14 &amp;lt;number&amp;gt;
  9. 12/6/14 &amp;lt;number&amp;gt;
  10. 12/6/14 &amp;lt;number&amp;gt;
  11. 12/6/14 &amp;lt;number&amp;gt;
  12. 12/6/14 &amp;lt;number&amp;gt;
  13. 12/6/14 &amp;lt;number&amp;gt;
  14. 12/6/14 &amp;lt;number&amp;gt;
  15. 12/6/14 &amp;lt;number&amp;gt;
  16. 12/6/14 &amp;lt;number&amp;gt;
  17. 12/6/14 &amp;lt;number&amp;gt;
  18. 12/6/14 &amp;lt;number&amp;gt;
  19. 12/6/14 &amp;lt;number&amp;gt;
  20. 12/6/14 &amp;lt;number&amp;gt;
  21. 12/6/14 &amp;lt;number&amp;gt;
  22. 12/6/14 &amp;lt;number&amp;gt;
  23. 12/6/14 &amp;lt;number&amp;gt;
  24. 12/6/14 &amp;lt;number&amp;gt;
  25. 12/6/14 &amp;lt;number&amp;gt;
  26. 12/6/14 &amp;lt;number&amp;gt;
  27. 12/6/14 &amp;lt;number&amp;gt;
  28. 12/6/14 &amp;lt;number&amp;gt;
  29. 12/6/14 &amp;lt;number&amp;gt;
  30. 12/6/14 &amp;lt;number&amp;gt;
  31. 12/6/14 &amp;lt;number&amp;gt;
  32. 12/6/14 &amp;lt;number&amp;gt;
  33. 12/6/14 &amp;lt;number&amp;gt;
  34. 12/6/14 &amp;lt;number&amp;gt;
  35. 12/6/14 &amp;lt;number&amp;gt;
  36. 12/6/14 &amp;lt;number&amp;gt;
  37. 12/6/14 &amp;lt;number&amp;gt;
  38. 12/6/14 &amp;lt;number&amp;gt;
  39. 12/6/14 &amp;lt;number&amp;gt;
  40. 12/6/14 &amp;lt;number&amp;gt;
  41. 12/6/14 &amp;lt;number&amp;gt;
  42. 12/6/14 &amp;lt;number&amp;gt;
  43. 12/6/14 &amp;lt;number&amp;gt;
  44. 12/6/14 &amp;lt;number&amp;gt;
  45. 12/6/14 &amp;lt;number&amp;gt;
  46. 12/6/14 &amp;lt;number&amp;gt;
  47. 12/6/14 &amp;lt;number&amp;gt;
  48. 12/6/14 &amp;lt;number&amp;gt;
  49. 12/6/14 &amp;lt;number&amp;gt;
  50. 12/6/14 &amp;lt;number&amp;gt;
  51. 12/6/14 &amp;lt;number&amp;gt;
  52. 12/6/14 &amp;lt;number&amp;gt;
  53. 12/6/14 &amp;lt;number&amp;gt;
  54. 12/6/14 &amp;lt;number&amp;gt;
  55. 12/6/14 &amp;lt;number&amp;gt;
  56. 12/6/14 &amp;lt;number&amp;gt;
  57. 12/6/14 &amp;lt;number&amp;gt;
  58. 12/6/14 &amp;lt;number&amp;gt;
  59. 12/6/14 &amp;lt;number&amp;gt;
  60. 12/6/14 &amp;lt;number&amp;gt;
  61. 12/6/14 &amp;lt;number&amp;gt;
  62. 12/6/14 &amp;lt;number&amp;gt;
  63. 12/6/14 &amp;lt;number&amp;gt;
  64. 12/6/14 &amp;lt;number&amp;gt;
  65. 12/6/14 &amp;lt;number&amp;gt;
  66. 12/6/14 &amp;lt;number&amp;gt;
  67. 12/6/14 &amp;lt;number&amp;gt;
  68. 12/6/14 &amp;lt;number&amp;gt;
  69. 12/6/14 &amp;lt;number&amp;gt;
  70. 12/6/14 &amp;lt;number&amp;gt;
  71. 12/6/14 &amp;lt;number&amp;gt;
  72. 12/6/14 &amp;lt;number&amp;gt;
  73. 12/6/14 &amp;lt;number&amp;gt;
  74. 12/6/14 &amp;lt;number&amp;gt;
  75. 12/6/14 &amp;lt;number&amp;gt;
  76. 12/6/14 &amp;lt;number&amp;gt;
  77. 12/6/14 &amp;lt;number&amp;gt;
  78. 12/6/14 &amp;lt;number&amp;gt;
  79. 12/6/14 &amp;lt;number&amp;gt;
  80. 12/6/14 &amp;lt;number&amp;gt;
  81. 12/6/14 &amp;lt;number&amp;gt;
  82. 12/6/14 &amp;lt;number&amp;gt;
  83. 12/6/14 &amp;lt;number&amp;gt;
  84. 12/6/14 &amp;lt;number&amp;gt;
  85. 12/6/14 &amp;lt;number&amp;gt;
  86. 12/6/14 &amp;lt;number&amp;gt;
  87. 12/6/14 &amp;lt;number&amp;gt;
  88. 12/6/14 &amp;lt;number&amp;gt;
  89. 12/6/14 &amp;lt;number&amp;gt;
  90. 12/6/14 &amp;lt;number&amp;gt;