일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Grid
- javascipt
- relative
- grid-column-start
- box-shadow
- grid-row-start
- gird-row-end
- CSS
- valuable
- border-style
- foreach()
- confirm()
- localStorage
- className
- javascript
- React
- variables
- prompt()
- grid-column-end
- classList
- grid-template-areas
- mongodb
- var
- collapsing-margins
- scope
- css#cascading#display#block#inline
- react-hook-form
- package.json
- createElement
- python #qqplot #qq-plot #code
- Today
- Total
data life
[JavaScript] Scope 본문
스코프(Scope)
1️⃣ 전역 스코프 vs 전역 스코프
2️⃣ 전역 객체
3️⃣ 호이스팅
4️⃣ IIFE
1️⃣ 전역 스코프 vs 전역 스코프
전역 스코프 (Global Scope)
let foo = 'foo';
{
console.log(foo); //foo
}
function func(){
console.log(foo); //foo
}
if (true) {
console.log(foo); //foo
}
어디서나 쓸 수 있지만 동작 결과는 예측하기 어렵다
즉, 전역 스코프의 큰 단점은 런타임 시점(프로그래밍 실행시점)을 알지 못한다는 것
지역 스코프 (Local Scope)
- 함수 스코프
- 블록 스코프 { }
var | let | const | |
전역 스코프 | ⭕️ | ❌ | ❌ |
함수 스코프 | ⭕️ | ⭕️ | ⭕️ |
블록 스코프 | ❌ | ⭕️ | ⭕️ |
재선언 | ⭕️ | ❌ | ❌ |
재할당 | ⭕️ | ⭕️ | ❌ |
2️⃣ 전역 객체
✅ 브라우저 => window 객체
✅ Node.js => global 객체
3️⃣ 호이스팅
호이스팅이란?
=> 선언한 코드를 내부적으로 최상단으로 끌어올리는 것
- var와 함수 선언이 대상이다.
- 선언된 var는 최상단으로 올라간다는 의미 (let, const는 최상단으로 올라갈 수 없다.)
- 선언된 함수는 최상단으로 올라간다는 의미
function foo() {
console.log(hoist);
var hoist = '호이스팅';
console.log(hoist);
}
위의 함수 실행 결과를 예측해보자
.
.
.
function foo() {
console.log(hoist); //undefined
var hoist = '호이스팅'; //호이스팅
console.log(hoist); //호이스팅, undefined
}
foo() //undefined
undefined지만 오류가 나타나지 않는다
>> 변수 선언을 끌어올리는 자바스크립트 성질 때문!
>> 변수 선언 시, 최대한 var 사용은 자제!
위의 코드는 다음과 같다고 볼 수 있다.
function foo() {
var hoist //변수 선언을 끌어 올림
console.log(hoist); //undefined
hoist = '호이스팅'; //호이스팅
console.log(hoist); //호이스팅, undefined
}
foo() //undefined
4️⃣ IIFE
즉시 실행 함수 (Immediately Invoked Function Expression)
>> 스코프를 지정할 수 없는 var의 특성으로 생겨난 함수로 블록을 지정해 줄 수 있다.
>> 블록 스코프를 흉내냄
>> 불필요한 변수 및 함수 생성❌
>> 스코프 충돌이 발생하지 않는다.
>> 한번만 호출하는 경우에 사용된다
function init(){초기 설정 로직}
(function(){초기 설정 로직})()
if (true) {
(function() {
var temp = 'hello';
console.log(temp); //hello
})()
}
console.log(temp); //temp is not defined
(function() { //IIFE 시작
// IIFE 내부 동작 코드
}); // IIFE 종료
단, 사용 시 세미콜론(;) 필수
let, const 등장으로 요즘에는 잘 쓰이진 않지만 외부에서 접근이 불가능하기 때문에 데이터나 변수를 숨길 때 이용
>> 추후 클로저 개념에서 설명
'Front-end > JavaScript' 카테고리의 다른 글
[JavaScript] Fetch (0) | 2023.03.10 |
---|---|
[JavaScript] Ajax (0) | 2023.03.10 |
[JavaScript] setTimeout(), setInterval() (0) | 2023.03.09 |
[JavaScript] 함수 (0) | 2023.03.07 |
[JavaScript] Pagination 구현 (0) | 2023.02.24 |