# INDEX
1. Values & Data type
2. Operators
3. Control flow
4. Scope & Hoisting
4-1. Concept of Scope
4-2. local scope & global scope
4-3. Rule
4-4. var vs let vs const
4-5. Global variable
4-6. Concept of Hoisting
5. Object & Array
6. This
7. Prototype & Inheritance
8. Function
9. Callback function
10. Closuer
11. Class
12. Others
- Scope : 변수 접근 규칙에 따른 유효 범위 (변수와 그에 할당된 값이, 어떤 범위 안에서 사용되는지를 판단하는 범위)
// ex) let의 유무
let name = "richard"; // 전역변수
function isName() {
let name = "jack"; // 지역변수 => 위의 변수name과는 완전히 별개의 변수
console.log(name); // 2번) jack
}
console.log(name); // 1번) richard
isName(); // isName함수가 실행됨(go up!)
console.log(name); // 3번) richard
// console출력 : richard jack richard
// ex) let의 유무
let name = "richard"; // 전역변수
function isName() {
name = "jack"; // 전역변수 => 선언(let)이 없기 때문에 전역변수 name을 그대로 가져옴
console.log(name); // 2번) jack
}
console.log(name); // 1번) richard
isName(); // isName함수가 실행됨(go up!)
console.log(name); // **3번) jack
// console출력 : richard jack jack
var
: JS는 기본적으로, 함수 단위로 자신만의 scope를 가짐let
: block단위로 scope를 구분했을 때 예측하기 쉬운 코드를 작성할 수 있음const
:let | const | var | |
---|---|---|---|
유효범위 | block scope | block scope | function scope |
값의 재할당 | 가능 | 불가능 | 가능 |
재선언 | 불가능 | 불가능 | 가능 |
// ex)
for (var i = 0; i < 5; i++) {
console.log(i); // 0,1,2,3,4
}
console.log("final i:" , i); //final i: 5
=> block범위를 벗어나도 같은 function scope안에서는 사용 가능
// ex) var
function greetSomeone (firstName) { //firstName = "Steve"
var time = "night"; //time = "night"
if (time === "night") {
var greeting = "Good night"; //greeting = "Good night"
}
return greeting + " " + firstName;
};
greetSomeone("Steve"); //"Good night Steve"
// ex) let
function greetSomeone (firstName) { //first = "Steve"
let time = "night"; //time = "night"
if (time === "night") {
let greeting = "Good night";
//여기서는?? all 사용 가능??
}
return greeting + " " + firstName;
};
greetSomeone("Steve");
function foo () {
age = 1; // age는 전역변수로 취급됨 // age === window.age
console.log(age); // error가 날까? 안남..
}
foo (); // 1
console.log(age) // 1
=> "use strict"
: 위와 같은 실수를 막기 위해 사용 (문법적 실수를 error
로 판단)
** Hoist : to lift something heavy, sometimes using ropes or a machine
- Hoisting : 함수 내의 모든 변수 선언문이 스코프 내에서 최상위로 끌어올려져, 해당 함수 block의 최상단에 선언되는 것
** tip! 함수, 변수가 호이스팅으로 인해 스코프가 혼란스럽게 될 수 있으므로 되도록 코드 상단부분에 선언하기!
// ex1) 다음 코드 비교해보기
var a = 1;
console.log(a); // 1
console.log(a); // undefined
var a = 1;
// 여기서 에러가 나지 않는 이유는? 다음의 순서로 진행되기 때문!
// 1) var a; // 선언 부분이 호이스팅
// 2) console.log(a); // a를 찾을 수 없음 (undefined)
// 3) a = 1; // a에 1이 할당됨
와우.. 정리 쩌러주시네
유익하게 잘봤습니다!
선언없이 초기화된 전역 변수
age : 1 -> age = 1 (오타 수정)