152
1

Kyle Simpson - Advanced JavaScript

Embed Size (px)

Citation preview

Page 1: Kyle Simpson - Advanced JavaScript

1

Page 2: Kyle Simpson - Advanced JavaScript

Kyle Simpson@getify

http://getify.me

• LABjs• grips• asynquence

2

Page 3: Kyle Simpson - Advanced JavaScript

Kyle Simpson@getify

http://getify.me

http://speakerdeck.com/getify

3

Page 4: Kyle Simpson - Advanced JavaScript

4

http://YouDontKnowJS.com

Page 5: Kyle Simpson - Advanced JavaScript

5

Page 6: Kyle Simpson - Advanced JavaScript

6

Page 8: Kyle Simpson - Advanced JavaScript

Advanced JavaScriptThe “What you need to know” Parts

8

Page 9: Kyle Simpson - Advanced JavaScript

9

Page 10: Kyle Simpson - Advanced JavaScript

Scope, Closures• Nested Scope• Hoisting• this• Closure

Agenda10

Page 11: Kyle Simpson - Advanced JavaScript

Scope

Scope: where to look for things

11

Page 12: Kyle Simpson - Advanced JavaScript

Scope

JavaScript has function scope only*

12

Page 13: Kyle Simpson - Advanced JavaScript

Scope

13

Page 14: Kyle Simpson - Advanced JavaScript

Scope

14

Page 15: Kyle Simpson - Advanced JavaScript

Scope

15

Page 16: Kyle Simpson - Advanced JavaScript

Scope: function scope?

16

Page 17: Kyle Simpson - Advanced JavaScript

Scope: block scope?

17

Page 18: Kyle Simpson - Advanced JavaScript

Scope

lexical scope

dynamic scope

18

Page 19: Kyle Simpson - Advanced JavaScript

Scope

19

Page 20: Kyle Simpson - Advanced JavaScript

Scope: lexical

20

Page 21: Kyle Simpson - Advanced JavaScript

Scope: WAT!?

21

Page 22: Kyle Simpson - Advanced JavaScript

Scope: WAT!?

22

Page 23: Kyle Simpson - Advanced JavaScript

Function Scope

23

IIFE

http://benalman.com/news/2010/11/immediately-invoked-function-expression/

Page 24: Kyle Simpson - Advanced JavaScript

Function Scope

24

Page 25: Kyle Simpson - Advanced JavaScript

Block Scope

25

Page 26: Kyle Simpson - Advanced JavaScript

Block Scope

let (ES6+)

26

Page 27: Kyle Simpson - Advanced JavaScript

Block Scope: let

27

Page 28: Kyle Simpson - Advanced JavaScript

Block Scope: let

28

Page 29: Kyle Simpson - Advanced JavaScript

Block Scope: let

29

Page 30: Kyle Simpson - Advanced JavaScript

Block Scope: let

30

https://gist.github.com/getify/5285514

Page 31: Kyle Simpson - Advanced JavaScript

Block Scope: let

31

https://github.com/getify/let-er

Page 32: Kyle Simpson - Advanced JavaScript

Block Scope: let

32

https://github.com/getify/let-er

Page 33: Kyle Simpson - Advanced JavaScript

Scope

dynamic scope

33

Page 34: Kyle Simpson - Advanced JavaScript

Scope: dynamic!?!?

34

Page 35: Kyle Simpson - Advanced JavaScript

Scope

35

Quiz1. What type of scoping rule(s) does JavaScript have? Exceptions?2. What are the different ways you can create a new scope?3. What’s the difference between undeclared and undefined?

Page 36: Kyle Simpson - Advanced JavaScript

Scope: hoisting

36

Page 37: Kyle Simpson - Advanced JavaScript

Scope: hoisting

37

Page 38: Kyle Simpson - Advanced JavaScript

Scope: hoisting

38

Page 39: Kyle Simpson - Advanced JavaScript

Scope: hoisting

39

Page 40: Kyle Simpson - Advanced JavaScript

Scope: hoisting

40

Page 41: Kyle Simpson - Advanced JavaScript

Hoisting: functions first

41

Page 42: Kyle Simpson - Advanced JavaScript

Hoisting: recursion

42

Page 43: Kyle Simpson - Advanced JavaScript

Hoisting: let gotcha

43

Page 45: Kyle Simpson - Advanced JavaScript

this

45

Page 46: Kyle Simpson - Advanced JavaScript

this

46

Every function, while executing, has a reference to its current execution context,

called this.

Page 47: Kyle Simpson - Advanced JavaScript

this

47

Remember lexical scope vs. dynamic scope?

JavaScript’s version of “dynamic scope” is this.

Page 48: Kyle Simpson - Advanced JavaScript

Scope

48

Page 49: Kyle Simpson - Advanced JavaScript

this: implicit & default binding

49

Page 50: Kyle Simpson - Advanced JavaScript

this: implicit & default binding

50

Page 51: Kyle Simpson - Advanced JavaScript

this: binding confusion

51

Page 52: Kyle Simpson - Advanced JavaScript

this: binding confusion

52

Page 53: Kyle Simpson - Advanced JavaScript

this: explicit binding

53

Page 54: Kyle Simpson - Advanced JavaScript

this: hard binding

54

Page 55: Kyle Simpson - Advanced JavaScript

this: hard binding

55

Page 56: Kyle Simpson - Advanced JavaScript

this: hard binding

56

Page 57: Kyle Simpson - Advanced JavaScript

this: hard binding

57https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind

Page 58: Kyle Simpson - Advanced JavaScript

this: new

58

Page 59: Kyle Simpson - Advanced JavaScript

this: new, order of precedence

59

Page 60: Kyle Simpson - Advanced JavaScript

this: determination

60

1. Was the function called with `new`?2. Was the function called with `call` or `apply` specifying an explicit this?3. Was the function called via a containing/owning object (context)?4. DEFAULT: global object (except strict mode)

Page 61: Kyle Simpson - Advanced JavaScript

this

61

Quiz1. What determines which object a function’s this points to? What’s the default?2. How do you “borrow” a function by implicit assignment of this?3. How do you explicitly bind this?4. How can you seal a specific this to a function? Why do that? Why not?5. How do you create a new this?

Page 62: Kyle Simpson - Advanced JavaScript

Closure

62

Page 63: Kyle Simpson - Advanced JavaScript

Closure

63

Remember lexical scope?

Closure absolutely depends on it. Go review it if you’re still

confused. :)

Page 64: Kyle Simpson - Advanced JavaScript

Closure

64

Closure is when a function “remembers” its lexical scope even when the function is

executed outside that lexical scope.

Page 65: Kyle Simpson - Advanced JavaScript

Closure

65

Page 66: Kyle Simpson - Advanced JavaScript

Closure

66

Page 67: Kyle Simpson - Advanced JavaScript

Closure

67

Page 68: Kyle Simpson - Advanced JavaScript

Closure

68

Page 69: Kyle Simpson - Advanced JavaScript

Closure: shared scope

69

Page 70: Kyle Simpson - Advanced JavaScript

Closure: nested scope

70

Page 71: Kyle Simpson - Advanced JavaScript

Closure: loops

71

Page 72: Kyle Simpson - Advanced JavaScript

Closure: loops

72

Page 73: Kyle Simpson - Advanced JavaScript

Closure: loops + block scope

73

Page 74: Kyle Simpson - Advanced JavaScript

Closure?

74

Page 75: Kyle Simpson - Advanced JavaScript

Closure: classic module pattern

75

Page 76: Kyle Simpson - Advanced JavaScript

Closure: modified module pattern

76

Page 77: Kyle Simpson - Advanced JavaScript

Closure: modern module pattern

77

Page 78: Kyle Simpson - Advanced JavaScript

Closure: future/ES6+ module pattern

78foo.js:

Page 79: Kyle Simpson - Advanced JavaScript

Closure

79

Quiz1. What is a closure and how is it created?2. How long does its scope stay around?3. Why doesn’t a function callback inside a loop behave as expected? How do we fix it?4. How do you use a closure to create an encapsulated module? What’s the benefits of that approach?

Page 81: Kyle Simpson - Advanced JavaScript

81

Page 82: Kyle Simpson - Advanced JavaScript

Object-Orienting• Common OO Patterns• prototype• “Inheritance” vs. “Behavior Delegation”

(OO vs. OLOO)

Agenda82

Page 83: Kyle Simpson - Advanced JavaScript

OO Design Patterns

83

Page 84: Kyle Simpson - Advanced JavaScript

OO Design Patterns

84

Singleton

Page 85: Kyle Simpson - Advanced JavaScript

OO Design Patterns: singleton

85

Page 86: Kyle Simpson - Advanced JavaScript

OO Design Patterns: singleton

86

Page 87: Kyle Simpson - Advanced JavaScript

OO Design Patterns

87

Observer

Page 88: Kyle Simpson - Advanced JavaScript

OO Design Patterns: observer

88

Page 89: Kyle Simpson - Advanced JavaScript

prototype

89

Page 90: Kyle Simpson - Advanced JavaScript

prototype

90

Every single “object” is built by a constructor

function

Page 91: Kyle Simpson - Advanced JavaScript

prototype

91

Each time a constructor is called, a new object is

created

Page 92: Kyle Simpson - Advanced JavaScript

prototype

92

A constructor makes an object “based on” its own

prototype

Page 93: Kyle Simpson - Advanced JavaScript

prototype

93

A constructor makes an object linked to its own

prototype

Page 94: Kyle Simpson - Advanced JavaScript

prototype

94

Page 95: Kyle Simpson - Advanced JavaScript

prototype

95

Page 96: Kyle Simpson - Advanced JavaScript

prototype

96

Page 97: Kyle Simpson - Advanced JavaScript

prototype

97

Page 98: Kyle Simpson - Advanced JavaScript

Scope

98

Page 99: Kyle Simpson - Advanced JavaScript

prototype: objects linked

99

Page 100: Kyle Simpson - Advanced JavaScript

prototype: objects linked

100

Page 101: Kyle Simpson - Advanced JavaScript

prototype: objects linked

101

Page 102: Kyle Simpson - Advanced JavaScript

prototype

102

Quiz1. What is a constructor?2. What is a [[Prototype]] and where does it come from?3. How does a [[Prototype]] affect an object?4. How do we find out where an object’s [[Prototype]] points to (3 ways)?

Page 103: Kyle Simpson - Advanced JavaScript

prototype: this redux

103

remember how this has a pesky way of getting

unassigned?

Page 104: Kyle Simpson - Advanced JavaScript

prototype: this redux

104

Page 106: Kyle Simpson - Advanced JavaScript

OO

106

Inheritance

Page 107: Kyle Simpson - Advanced JavaScript

OO: classical inheritance

107

Foo

Bar

a1

a2

b1

b2

Page 108: Kyle Simpson - Advanced JavaScript

OO: “prototypal inheritance”

108

Foo.prototype a1

a2

b1

b2

(another design pattern)

Bar.prototype

Page 109: Kyle Simpson - Advanced JavaScript

OO: js

109

JS “Inheritance”“Behavior Delegation”

Page 110: Kyle Simpson - Advanced JavaScript

OO: inheritance delegation

110

Page 111: Kyle Simpson - Advanced JavaScript

OO: behavior delegation

111

Let’s simplify!

Page 112: Kyle Simpson - Advanced JavaScript

OLOO

112

OLOO:Objects Linked to Other

Objects

Page 113: Kyle Simpson - Advanced JavaScript

OLOO: delegated objects

113

Page 114: Kyle Simpson - Advanced JavaScript

OLOO: delegated objects

114

Page 115: Kyle Simpson - Advanced JavaScript

OLOO: delegated objects

115

Page 116: Kyle Simpson - Advanced JavaScript

OLOO: delegated objects

116

Page 117: Kyle Simpson - Advanced JavaScript

117

OO: old & busted

Page 118: Kyle Simpson - Advanced JavaScript

OO: old & busted

118

Page 119: Kyle Simpson - Advanced JavaScript

119

OLOO: new hotness

Page 120: Kyle Simpson - Advanced JavaScript

120

OLOO: new hotness

Page 121: Kyle Simpson - Advanced JavaScript

OLOO: Object.create()

121

Page 122: Kyle Simpson - Advanced JavaScript

OLOO: object creation

122

https://gist.github.com/getify/5572383

https://gist.github.com/getify/5226305

Page 123: Kyle Simpson - Advanced JavaScript

OLOO: js

123

Quiz1. How is JavaScript’s [[Prototype]] chain not like traditional/classical inheritance?2. What does “behavior delegation” mean and how does it describe object linking in JS?3. Why is “behavior delegation” as a design pattern a helpful thing? What are the tradeoffs?

Page 125: Kyle Simpson - Advanced JavaScript

125

Page 126: Kyle Simpson - Advanced JavaScript

126

Async Patterns• Callbacks• Generators/Coroutines• Promises

Agenda

Page 127: Kyle Simpson - Advanced JavaScript

Async Patterns

127

Callbacks

Page 128: Kyle Simpson - Advanced JavaScript

Async Patterns: callbacks

128

Page 129: Kyle Simpson - Advanced JavaScript

Async Patterns: “callback hell”

129

Page 130: Kyle Simpson - Advanced JavaScript

Async Patterns: “callback hell”

130

Page 131: Kyle Simpson - Advanced JavaScript

Async Patterns: “callback hell”

131

Inversion of Control

Page 132: Kyle Simpson - Advanced JavaScript

Async Patterns: separate callbacks

132

Page 133: Kyle Simpson - Advanced JavaScript

Async Patterns: “error-first style”

133

Page 134: Kyle Simpson - Advanced JavaScript

Async Patterns: nested-callback tasks

134

Page 135: Kyle Simpson - Advanced JavaScript

Async Patterns

135

Generators (yield)

Page 136: Kyle Simpson - Advanced JavaScript

Async Patterns: generators

136

Page 137: Kyle Simpson - Advanced JavaScript

Async Patterns: generator coroutines

137

Page 138: Kyle Simpson - Advanced JavaScript

Async Patterns: generator messages

138

Page 139: Kyle Simpson - Advanced JavaScript

Async Patterns: yield tasks

139

Page 140: Kyle Simpson - Advanced JavaScript

Async Patterns

140

Promises

“continuation events”

Page 141: Kyle Simpson - Advanced JavaScript

Async Patterns: jQuery-style promises

141

Page 142: Kyle Simpson - Advanced JavaScript

Async Patterns: jQuery-style promises

142

Page 143: Kyle Simpson - Advanced JavaScript

Async Patterns: (native) promise tasks

143

Page 144: Kyle Simpson - Advanced JavaScript

Async Patterns: promises sequence

144

sequence = automatically chained promises

Page 145: Kyle Simpson - Advanced JavaScript

Async Patterns: sequences & gates

145https://github.com/getify/asynquence

Page 146: Kyle Simpson - Advanced JavaScript

Async Patterns: sequence tasks

146

Page 147: Kyle Simpson - Advanced JavaScript

Async Patterns: generator+sequence tasks

147

Page 148: Kyle Simpson - Advanced JavaScript

Async Patterns: CSP-style generators

148

Page 149: Kyle Simpson - Advanced JavaScript

Async Patterns

149

Quiz1. What is “callback hell”? Why do callbacks suffer from “inversion of control”?2. How do you pause a generator? How do you resume it?3. What is a Promise? How does it solve inversion of control issues?4. How do we combine generators and promises for flow control?

Page 151: Kyle Simpson - Advanced JavaScript

151

Page 152: Kyle Simpson - Advanced JavaScript

Kyle Simpson@getify

http://getify.me

Thanks!

Questions?

152