Top Banner
pragmadash Денис Речкунов Node.js-разработчик Распространённые ошибки в JavaScript
34

#2 "Распространённые ошибки в JavaScript" Денис Речкунов

Jul 27, 2015

Download

Documents

JSib
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

pragmadash Денис РечкуновNode.js-разработчик

Распространённые ошибки в JavaScript

Page 2: #2 "Распространённые ошибки в JavaScript" Денис Речкунов
Page 3: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

А что если знать

все о JavaScript?

Page 4: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Вот он узнал всё

Page 5: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Много

возможностей

Page 6: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Даже слишком

Page 7: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Большая

ответственность!

Page 8: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Мы должны защитить себя

сами

Page 9: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

И так – начнем

Page 10: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Что не так?Constructor.prototype.method = function () {

setTimeout(function () {

this.anotherMethod();

}, 5000);

};

Constructor.prototype.anotherMethod = function () { };

01.

02.

03.

04.

05.

06.

10

Page 11: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

this === хозяин метода setTimeoutConstructor.prototype.method = function () {

setTimeout(function () {

this.anotherMethod();

}, 5000);

};

Constructor.prototype.anotherMethod = function () { };

Uncaught TypeError: undefined is not a function

01.

02.

03.

04.

05.

06.

11

Page 12: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

this. Решение 1Constructor.prototype.method = function () {

var self = this;

setTimeout(function () {

self.anotherMethod();

}, 5000);

};

Constructor.prototype.anotherMethod = function () { };

01.

02.

03.

04.

05.

06.

07.

12

Page 13: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

this. Решение 2Constructor.prototype.method = function () {

setTimeout(function () {

this.anotherMethod();

}.bind(this), 5000);

};

Constructor.prototype.anotherMethod = function () { };

01.

02.

03.

04.

05.

06.

13

Page 14: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Что не так?var index = 123, arr = ['tro', 'lo', 'lo'];

for (var index = 0; index < arr.length; index++) {

arr[index] += 'o';

}

console.log(index);

Output: 123

01.

02.

03.

04.

05.

14

Page 15: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Scope не задается блокомvar index = 123, arr = ['tro', 'lo', 'lo'];

for (var index = 0; index < arr.length; index++) {

arr[index] += 'o';

}

console.log(index);

Output: 3

01.

02.

03.

04.

05.

15

Page 16: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Что не так?var obj = {some: 'first', another: 'second'};

for(var key in obj) {

setTimeout(function () {

console.log(obj[key]);

}, 1000);

}

Output: first second

01.

02.

03.

04.

05.

06.

16

Page 17: #2 "Распространённые ошибки в JavaScript" Денис Речкунов
Page 18: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Переменная цикла мутабильнаvar obj = {some: 'first', another: 'second'};

for(var key in obj) {

setTimeout(function () {

console.log(obj[key]);

}, 1000);

}

Output: second second

01.

02.

03.

04.

05.

06.

18

Page 19: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Переменная цикла. Решение 1var obj = {some: 'first', another: 'second'};

for(var key in obj) {

(function (currentKey){

setTimeout(function () {

console.log(obj[currentKey]);

}, 1000);

})(key);

}

01.

02.

03.

04.

05.

06.

07.

08.

19

Page 20: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Переменная цикла. Решение 2var obj = {some: 'first', another: 'second'};

Object.keys(obj)

.forEach(function (key) {

setTimeout(function () {

console.log(obj[key]);

}, 1000);

});

01.

02.

03.

04.

05.

06.

07.

20

Page 21: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Что не так?var some = 'cool and not ';

function foo() {

console.log(some);

var some = 'awful!';

console.log(some);

}

foo();

Output: cool and not awful!

01.

02.

03.

04.

05.

06.

07.

21

Page 22: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Hoistingvar some = 'cool and not ';

function foo() {

console.log(some); // some === undefined

var some = 'awful!';

console.log(some);

}

foo();

Output: undefined awful!

01.

02.

03.

04.

05.

06.

07.

22

Page 23: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Что плохого?for (var index = 0; index < 1000000; index++) {

console.log(index);

}

01.

02.

03.

23

Page 24: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Длинный циклfor (var index = 0; index < 1000000; index++) {

console.log(index);

}

Страница не обрабатывает события

Сервер не принимает новые подключения

01.

02.

03.

24

Page 25: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Длинный цикл. Решениеvar index = 0;

function next() {

if (index >= 1000000) { return; }

console.log(index++);

setTimeout(next, 0);

}

next();

01.

02.

03.

04.

05.

06.

07.

25

Page 26: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Что нет так?var arr = [];

arr[5] = 'some';

console.log(arr.length);

Output: 1

01.

02.

03.

26

Page 27: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

length === max(index) + 1var arr = [];

arr[5] = 'some';

console.log(arr.length);

Output: 6

Использовать push/unshift/pop/shift

01.

02.

03.

27

Page 28: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Что нет так?var arr = [];

arr[5] = 'some';

delete arr[5];

console.log(arr.length);

Output: 0

01.

02.

03.

04.

28

Page 29: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

undefined x 6var arr = [];

arr[5] = 'some';

delete arr[5];

console.log(arr.length);

Output: 6

Не использовать delete

01.

02.

03.

04.

29

Page 30: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

И последний пример

Page 31: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Что не так?function foo () {

return

{

name: 'Batman'

};

}

console.log(foo());

01.

02.

03.

04.

05.

06.

07.

31

Page 32: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Конечно не Batman, он великолепен!function foo () {

return

{

name: 'Batman'

};

}

console.log(foo());

Парсер подставит ';'

01.

02.

03.

04.

05.

06.

07.

32

Page 33: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

И вообще советы• Использовать Strict Mode

• Проверять код JShint

• Использовать IDE – WebStorm, например

• Boolean(x), Number(x), String(x) – для приведения типов

• Mozilla Developer Network

33

Page 34: #2 "Распространённые ошибки в JavaScript" Денис Речкунов

Вопросы?