4. Global Scope
Function Scope
Block Scope
프로그램 전체적으로 접근할 수 있는
최상위 유효범위, 이 유효범위는 host
객체와 연관되며 브라우저는 window
Node.js에는 global로 존재함
함수 내에서만 변수가 저장되고
접근할 수 있는 유효범위
블록 내에서만 변수가 저장되고
접근할 수 있는 유효범위
let, const(ECMAScript 6)
13. Global Scope
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
14. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
15. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(something)
17. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(something)
Lexical Scope
(print)
18. Global Scope
Lexical Scope
(print)
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Lexical Scope
(something)
20. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
21. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
22. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);☛
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
23. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
24. ☛ function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
25. ☛ function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
26. ☛ function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
27. ☛ function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
28. ☛ function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
2
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
29. ☛ function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
2
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
30. ☛ function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
2
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
31. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
32. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
33. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
34. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
35. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
36. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
37. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1 2
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
38. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1 2
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
39. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1 2
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
40. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1 23
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
41. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
42. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
43. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
44. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
45. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
46. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
3
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
47. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
48. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
3
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
49. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
3
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
50. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
3
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
51. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
52. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
53. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
54. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
55. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
56. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
57. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
58. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
59. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
60. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1 2
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
61. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1 2
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
62. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1 2
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
63. ☛
function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
1 2 3
Global Scope
Lexical Scope
(print)
Lexical Scope
(something)
65. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
function outerFunc() {
function innerFunc() {
a = 20;
}
innerFunc();
}
outerFunc();
[Left Hand Side]
* 변수가 Global 스코프에 있다면 전달
* 없다면 Global 스코프에 생성하여 전달
* ’use strict’ 모드에서는 ReferenceError 발생
66. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
function outerFunc() {
function innerFunc() {
a = 20;
}
innerFunc();
}
outerFunc();
[Left Hand Side]
* 변수가 Global 스코프에 있다면 전달
* 없다면 Global 스코프에 생성하여 전달
* ’use strict’ 모드에서는 ReferenceError 발생
67. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
function outerFunc() {
function innerFunc() {
a = 20;
}
innerFunc();
}
outerFunc();
☛
[Left Hand Side]
* 변수가 Global 스코프에 있다면 전달
* 없다면 Global 스코프에 생성하여 전달
* ’use strict’ 모드에서는 ReferenceError 발생
68. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
function outerFunc() {
function innerFunc() {
a = 20;
}
innerFunc();
}
outerFunc();
☛
[Left Hand Side]
* 변수가 Global 스코프에 있다면 전달
* 없다면 Global 스코프에 생성하여 전달
* ’use strict’ 모드에서는 ReferenceError 발생
69. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
function outerFunc() {
function innerFunc() {
a = 20;
}
innerFunc();
}
outerFunc();
☛
[Left Hand Side]
* 변수가 Global 스코프에 있다면 전달
* 없다면 Global 스코프에 생성하여 전달
* ’use strict’ 모드에서는 ReferenceError 발생
70. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
function outerFunc() {
function innerFunc() {
a = 20;
}
innerFunc();
}
outerFunc();
☛
[Left Hand Side]
* 변수가 Global 스코프에 있다면 전달
* 없다면 Global 스코프에 생성하여 전달
* ’use strict’ 모드에서는 ReferenceError 발생
71. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
function outerFunc() {
function innerFunc() {
a = 20;
}
innerFunc();
}
outerFunc();
☛
[Left Hand Side]
* 변수가 Global 스코프에 있다면 전달
* 없다면 Global 스코프에 생성하여 전달
* ’use strict’ 모드에서는 ReferenceError 발생
72. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
function outerFunc() {
function innerFunc() {
a = 20;
}
innerFunc();
}
outerFunc();
☛
[Left Hand Side]
* 변수가 Global 스코프에 있다면 전달
* 없다면 Global 스코프에 생성하여 전달
* ’use strict’ 모드에서는 ReferenceError 발생
73. function outerFunc() {
function innerFunc() {
var a = b + 10;
}
innerFunc();
}
outerFunc();
[Right Hand Side]
* 변수가 Global 스코프에 있다면
변수에 저장된 값 전달
* 없다면 ReferenceError 발생
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
74. ☛
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
function outerFunc() {
function innerFunc() {
var a = b + 10;
}
innerFunc();
}
outerFunc();
[Right Hand Side]
* 변수가 Global 스코프에 있다면
변수에 저장된 값 전달
* 없다면 ReferenceError 발생
75. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
function outerFunc() {
function innerFunc() {
var a = b + 10;
}
innerFunc();
}
outerFunc();
[Right Hand Side]
* 변수가 Global 스코프에 있다면
변수에 저장된 값 전달
* 없다면 ReferenceError 발생
76. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
function outerFunc() {
function innerFunc() {
var a = b + 10;
}
innerFunc();
}
outerFunc();
[Right Hand Side]
* 변수가 Global 스코프에 있다면
변수에 저장된 값 전달
* 없다면 ReferenceError 발생
77. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
function outerFunc() {
function innerFunc() {
var a = b + 10;
}
innerFunc();
}
outerFunc();
[Right Hand Side]
* 변수가 Global 스코프에 있다면
변수에 저장된 값 전달
* 없다면 ReferenceError 발생
78. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
function outerFunc() {
function innerFunc() {
var a = b + 10;
}
innerFunc();
}
outerFunc();
[Right Hand Side]
* 변수가 Global 스코프에 있다면
변수에 저장된 값 전달
* 없다면 ReferenceError 발생
79. Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
function outerFunc() {
function innerFunc() {
var a = b + 10;
}
innerFunc();
}
outerFunc();
[Right Hand Side]
* 변수가 Global 스코프에 있다면
변수에 저장된 값 전달
* 없다면 ReferenceError 발생
80. Shadow variable 동일한 식별자의 변수가 하위 스코프에
존재할 때 버블링이 중지되고 상위
스코프까지 탐색하지 않게 만드는 변수
81. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
82. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
83. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
84. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
85. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
86. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
87. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
88. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
89. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
90. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
91. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
92. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
93. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
94. var a = 20;
var b = 5;
function outerFunc() {
var b = 10;
function innerFunc() {
var c = a + b;
}
innerFunc();
}
outerFunc();
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
Lexical Scope
(outerFunc)
Global Scope
Lexical Scope
(innerFunc)
☛
108. function something() {
const a = 10;
const b = 20;
{
const c = a + b;
console.log(c); // 30
}
console.log(c); // ??????????????
}
something();
109. function something() {
const a = 10;
const b = 20;
{
const c = a + b;
console.log(c); // 30
}
console.log(c); // ??????????????
}
something();
110. function something() {
const a = 10;
const b = 20;
{
const c = a + b;
console.log(c); // 30
}
console.log(c); // ReferenceError
}
something();
111. function something() {
console.log(a); // ?????????
console.log(b); // ?????????
var a, b;
// do something...
}
function something() {
console.log(a); // ??????????????
console.log(b); // ??????????????
let a, b;
// do something...
}
112. function something() {
console.log(a); // ?????????
console.log(b); // ?????????
var a, b;
// do something...
}
function something() {
console.log(a); // ??????????????
console.log(b); // ??????????????
let a, b;
// do something...
}
113. function something() {
console.log(a); // undefined
console.log(b); // undefined
var a, b;
// do something...
}
function something() {
console.log(a); // ReferenceError
console.log(b); // Not running
let a, b;
// do something...
}
115. function something() {
var a = 10;
console.log(a); // 10
console.log(i); // undefined;
console.log(n); // undefined;
console.log(b); // undefined;
for(var i = 0, n = a; i < n; i++) {
var b = a * i;
}
}
116. function something() {
var a = 10;
console.log(a); // 10
console.log(i); // undefined;
console.log(n); // undefined;
console.log(b); // undefined;
for(var i = 0, n = a; i < n; i++) {
var b = a * i;
}
}
Lexical Scope
(something)
117. function something() {
var a = 10;
console.log(a); // 10
console.log(i); // undefined;
console.log(n); // undefined;
console.log(b); // undefined;
for(var i = 0, n = a; i < n; i++) {
var b = a * i;
}
}
Lexical Scope
(something)
118. function something() {
var a = 10;
console.log(a); // 10
console.log(i); // undefined;
console.log(n); // undefined;
console.log(b); // undefined;
for(var i = 0, n = a; i < n; i++) {
var b = a * i;
}
}
Lexical Scope
(something)
119. function something() {
var a = 10;
console.log(a); // 10
console.log(i); // undefined;
console.log(n); // undefined;
console.log(b); // undefined;
for(var i = 0, n = a; i < n; i++) {
var b = a * i;
}
}
Lexical Scope
(something)
컴파일 단계에서 변수 선언문을 가장 먼저 해석
연관된 렉시컬 스코프에 변수를 연결
120. function something() {
var a;
var i;
var n;
var b;
a = 10;
console.log(a); // 10
console.log(i); // undefined;
console.log(n); // undefined;
console.log(b); // undefined;
for(i = 0, n = a; i < n; i++) {
b = a * i;
}
}
121. function something() {
var a;
var i;
var n;
var b;
a = 10;
console.log(a); // 10
console.log(i); // undefined;
console.log(n); // undefined;
console.log(b); // undefined;
for(i = 0, n = a; i < n; i++) {
b = a * i;
}
}
122. function something() {
var a;
var i;
var n;
var b;
a = 10;
console.log(a); // 10
console.log(i); // undefined;
console.log(n); // undefined;
console.log(b); // undefined;
for(i = 0, n = a; i < n; i++) {
b = a * i;
}
}
마치 변수를 끌어올려서 실행하는
모양과 같다하여 Hoisting이라고 함
128. Lexical Scope
(something)
함수 표현식일때는 변수 선언만
끌어올린다. 함수는 값으로써 실행
시점에 대입된다.
function something() {
console.log(innerFunc); // undefiend
innerFunc(); // ReferenceError
var innerFunc = function() {
// do something...
};
}
something();
129. function something() {
console.log(innerFunc); // ????????
innerFunc(); // ?
function innerFunc() {
console.log(1);
}
var innerFunc = function() {
console.log(2);
}
innerFunc(); // ?
}
something();
130. function something() {
console.log(innerFunc); // ????????
innerFunc(); // ?
function innerFunc() {
console.log(1);
}
var innerFunc = function() {
console.log(2);
}
innerFunc(); // ?
}
something();
Lexical Scope
(something)
131. function something() {
console.log(innerFunc); // ????????
innerFunc(); // ?
function innerFunc() {
console.log(1);
}
var innerFunc = function() {
console.log(2);
}
innerFunc(); // ?
}
something();
Lexical Scope
(something)
innerFunc는 이미 Scope 내에
존재하므로 무시
154. From the executable code associated with the
currently running execution context to executable code that
is not associated with that execution context.
155. code evaluation
From the executable code associated with the
currently running execution context to executable code that
is not associated with that execution context.
156. code evaluation
Global Code
Function Code
Eval Code
From the executable code associated with the
currently running execution context to executable code that
is not associated with that execution context.
157. code evaluation Initializing execution context
Initializing execution context
Initializing execution context
Global Code
Function Code
Eval Code
From the executable code associated with the
currently running execution context to executable code that
is not associated with that execution context.
206. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);☛
Execution Context
(something)
207. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);☛
Execution Context
(something)
this : ResolveThisBinding()
208. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);☛
Execution Context
(something)
this : ResolveThisBinding()
209. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);☛
Execution Context
(something)
this : global
213. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);☛
Execution Context
(something)
LexicalEnvironment : { … },
VariableEnvironment: { … },
this : global
214. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);☛
Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
215. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);☛
Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
outerEnvironmentReference GlobalEnvironmentRecord➠
216. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛ Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
217. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛ EnvironmentRecord
(something)
print: FunctionReference
a: undefined,
b: undefined,
c: undefined
218. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛ EnvironmentRecord
(something)
print: FunctionReference
a: 1,
b: 2,
c: undefined
219. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
EnvironmentRecord
(something)
print: FunctionReference
a: 1,
b: 2,
c: 3
220. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
EnvironmentRecord
(something)
print: FunctionReference
a: 1,
b: 2,
c: 3
221. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(something)
Execution Context
(Global)
⚑
222. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(something)
Execution Context
(Global)
⚑
Execution Context
(print)
223. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(something)
Execution Context
(Global)
⚑ Execution Context
(print)
224. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
225. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
outerEnvironmentReference LexicalEnvironmentRecord of something
Execution Context
(print)
➠
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
226. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
EnvironmentRecord
(print)
z: undefined
227. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
EnvironmentRecord
(print)
z: undefined
228. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
EnvironmentRecord
(print)
z: 3
229. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
230. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
231. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
232. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(print)
`a` variable is not in EnvironmentRecord of print
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
233. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
234. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
outerEnvironmentReference LexicalEnvironmentRecord of something
Execution Context
(print)
➠
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
235. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
EnvironmentRecord
(something)
print: FunctionReference
a: 1,
b: 2,
c: 3
236. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
EnvironmentRecord
(something)
print: FunctionReference
a: 1,
b: 2,
c: 3
Execution Context
(print)
237. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
EnvironmentRecord
(something)
print: FunctionReference
a: 1,
b: 2,
c: 3
Execution Context
(print)
238. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
239. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
EnvironmentRecord
(print)
z: 3
240. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
print(c);
}
something(1, 2);
☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
EnvironmentRecord
(print)
z: 3
Execution Context
(print)
241. var a = 10;
function outerFunc() {
function innerFunc() {
console.log(a);
}
innerFunc();
}
outerFunc();
☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
Execution Context
(innerFunc)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
Execution Context
(outerFunc)
EnvironmentRecord
(global)
a: 10
242. 어떤 함수가 선언된 환경을 벗어나
실 행 돼 도 선 언 된 시 점 의 상 위
환경(스코프)에 접근할 수 있게
되는 기능
Closure
243. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
☛
244. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
☛
245. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
☛
246. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
☛
[[closure]] :
print Function
247. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
☛
print Function
[[closure]] : LexicalEnvironment
(something)
248. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
☛
print Function
[[closure]] : LexicalEnvironment
(something)
249. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
☛
print Function
[[closure]] : LexicalEnvironment
(something)
250. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
☛
print Function
[[closure]] : LexicalEnvironment
(something)
251. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
Execution Context
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
☛
print Function
[[closure]] : LexicalEnvironment
(something)
252. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
☛
print Function
[[closure]] : LexicalEnvironment
(something)
253. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();☛
254. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
Execution Context
(print)
255. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
Execution Context
(print)
print Function
[[closure]] : LexicalEnvironment
(something)
256. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
Execution Context
(print)
print Function
[[closure]] : LexicalEnvironment
(something)
257. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
Execution Context
(print)
print Function
[[closure]] : LexicalEnvironment
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
258. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
Execution Context
(print)
print Function
[[closure]] : LexicalEnvironment
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
259. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
LexicalEnvironment
(something)
260. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
LexicalEnvironment
(something)
261. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
☛
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
LexicalEnvironment
(something)
262. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
LexicalEnvironment
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
263. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
LexicalEnvironment
(something)
`a` variable is not in
EnvironmentRecord of print
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
264. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
LexicalEnvironment
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global
265. function something(a, b) {
var c = a + b;
function print(z) {
console.log(`${a} + ${b} =`, z);
}
return print(c);
}
const log = something(1, 2);
log();
☛
Execution Context
(print)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
}
LexicalEnvironment
(something)
LexicalEnvironment : {
EnvironmentRecord,
OuterLexicalEnvironment
},
VariableEnvironment: {
EnvironmentRecord,
OuterLexicalEnvironment
}
this : global