SlideShare a Scribd company logo
JavaScript
Подробная презентация JavaScript 6 в 1
> 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
Подробная презентация JavaScript 6 в 1
План дня 
> История Web (продолжение) 
> Синтаксис 
> Работа с DOM 
> Good Parts & Bad Parts 
> Libraries 
> Performance notes 
> Домашнее задание
Цели 
> Общее понимание языка 
> Часто встречающиеся сложности 
> Заинтересовать в изучении 
> Best practice
Жалобы 
> Программирование в браузере это ужас 
> JS тормозит 
> я плохо знаю JS 
> JS просто большая куча ошибок
Подробная презентация JavaScript 6 в 1
История: JavaScript 
> Разработан за две недели 
> Много чего бездумно скопировано 
> Пострадал в результате войны браузеров 
> Стандартизируется ECMA + W3C
Подробная презентация JavaScript 6 в 1
Синтаксис
Синтаксис: Объекты 
> неупорядоченный набор свойств 
> 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

PPT
Подробная презентация JavaScript 6 в 1
PPT
Javascript
PPTX
Selenium: приемы работы
PDF
Decorators' recipes
PPTX
Максим Щепелин. "Unittesting. Как?"
PPTX
Владимир Горбенко «Использование блоков в Objective-C»
PDF
DevConf. Дмитрий Сошников - ECMAScript 6
PPT
Производительность в Django
Подробная презентация JavaScript 6 в 1
Javascript
Selenium: приемы работы
Decorators' recipes
Максим Щепелин. "Unittesting. Как?"
Владимир Горбенко «Использование блоков в Objective-C»
DevConf. Дмитрий Сошников - ECMAScript 6
Производительность в Django

What's hot (20)

PDF
Асинхронный JavaScript
PDF
Влад Ковташ — Yap Database
PDF
Профилирование и отладка Django
PDF
Лекция #5. Введение в язык программирования Python 3
PPTX
PHP basic
PPTX
I tmozg js_school
PDF
Очень вкусный фрукт Guava
PPTX
Нетривиальная обработка ошибок
PDF
PVS-Studio в 2021 - Примеры ошибок
PPT
Web весна 2012 лекция 9
PDF
Пластилиновый код: как перестать кодить и начать жить
PDF
Очередной скучный доклад про логгирование
PPT
Yii development
PDF
Perl: Symbol table
PDF
Perl 5.10 и 5.12
PDF
Функционально декларативный дизайн на C++
PDF
QA Fest 2019. Андрей Солнцев. Selenide для профи
PDF
Магия метаклассов
PPTX
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
PDF
Почему Mojolicious?
Асинхронный JavaScript
Влад Ковташ — Yap Database
Профилирование и отладка Django
Лекция #5. Введение в язык программирования Python 3
PHP basic
I tmozg js_school
Очень вкусный фрукт Guava
Нетривиальная обработка ошибок
PVS-Studio в 2021 - Примеры ошибок
Web весна 2012 лекция 9
Пластилиновый код: как перестать кодить и начать жить
Очередной скучный доклад про логгирование
Yii development
Perl: Symbol table
Perl 5.10 и 5.12
Функционально декларативный дизайн на C++
QA Fest 2019. Андрей Солнцев. Selenide для профи
Магия метаклассов
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Почему Mojolicious?
Ad

Viewers also liked (15)

PDF
AddConf. Дмитрий Сошников - Будущее ECMAScript
PDF
Обзор ES2015(ES6)
PDF
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
PPT
доклад
PPTX
JavaScript-модули "из прошлого в будущее"
PDF
Ecma script 6 in action
PDF
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
PDF
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
PDF
Дэвид Флэнаган — Javascript (5 издание)
PDF
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
PPTX
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
PPT
ECMAScript 6: A Better JavaScript for the Ambient Computing Era
PDF
Александр Русаков - TypeScript 2 in action
PDF
ES2015 / ES6: Basics of modern Javascript
PDF
ES6: The Awesome Parts
AddConf. Дмитрий Сошников - Будущее ECMAScript
Обзор ES2015(ES6)
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
доклад
JavaScript-модули "из прошлого в будущее"
Ecma script 6 in action
"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
Дэвид Флэнаган — Javascript (5 издание)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
ECMAScript 6: A Better JavaScript for the Ambient Computing Era
Александр Русаков - TypeScript 2 in action
ES2015 / ES6: Basics of modern Javascript
ES6: The Awesome Parts
Ad

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

PPT
Web весна 2013 лекция 9
PPT
Web осень 2012 лекция 9
PPTX
course js day 2
PDF
FPUG Dzyga presentation
PPTX
I tmozg js_school_jquery
PDF
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
PPTX
automation is iOS development
PDF
Михаил Давыдов — JavaScript: Базовые знания
PDF
Михаил Давыдов - JavaScript. Базовые знания
PDF
Михаил Давыдов - Транспорт, ajax
PPTX
JavaScript как объектно-ориентированный язык программирования
PDF
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
PDF
JavaScript. Loops and functions (in russian)
PDF
Mera Dev Fest - Swift vs. Obj-C
PDF
JavaScript. Async (in Russian)
PPTX
course js day 4
PPTX
Типичные ошибки начинающих писать тесты на WebDriver
PDF
Web internship java script
PPTX
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
PPT
PHP Tricks
Web весна 2013 лекция 9
Web осень 2012 лекция 9
course js day 2
FPUG Dzyga presentation
I tmozg js_school_jquery
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
automation is iOS development
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - Транспорт, ajax
JavaScript как объектно-ориентированный язык программирования
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
JavaScript. Loops and functions (in russian)
Mera Dev Fest - Swift vs. Obj-C
JavaScript. Async (in Russian)
course js day 4
Типичные ошибки начинающих писать тесты на WebDriver
Web internship java script
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
PHP Tricks

More from Vasya Petrov (20)

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

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

  • 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
  • 15. План дня > История Web (продолжение) > Синтаксис > Работа с DOM > Good Parts & Bad Parts > Libraries > Performance notes > Домашнее задание
  • 16. Цели > Общее понимание языка > Часто встречающиеся сложности > Заинтересовать в изучении > Best practice
  • 17. Жалобы > Программирование в браузере это ужас > JS тормозит > я плохо знаю JS > JS просто большая куча ошибок
  • 19. История: JavaScript > Разработан за две недели > Много чего бездумно скопировано > Пострадал в результате войны браузеров > Стандартизируется ECMA + W3C
  • 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

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