변수, 클로져

김종현·2023년 1월 11일
0

Js

목록 보기
4/13

변수 & 변수 선언

-변수명(식별자)는 변수의 값이 아닌 메모리 주소를 기억하여 변수명을 사용하면 매핑된 메모리 주소를 통해 저장된 값을 반환한다.
-변수에 값을 저장 : 할당(assignment), 해당 값을 읽는 것 : 참조(reference), 변수명을 엔진에 알리는 것 : 선언(declaration)
-JS의 변수 선언 : 선언->초기화를 거쳐 수행, 초기화 단계 : 값 저장 위한 메모리 공간 확보, 암묵적으로 undefined를 할당해 초기화.

var kmj
console.log(kmj) // output: undefined, var 선언은 선언&초기화가 동시에 진행되어 kmj에 암묵적으로 undefined를 할당.

console.log(kmj) // output: undefined, 호이스팅 때문에 콘솔을 먼저 찍어도 변환 값은 undefined.
var kmj

-호이스팅(hoisting) : 변수 선언을 포함한 모든 선언문(변수 선언문, 함수선언문 등)을 먼저 찾아 런타임 이전 단계에서 실행.
ㄴ var, let, const, function, function*, class 등 키워드를 사용해 선언한 모든 식별자(변수, 함수, 클래스 등)는 호이스팅이 된다.

변수 할당

-변수에 값 할당시 연산자(=)를 사용.

var kmj // 변수 선언
kmj = 'howdy-mj' // 값의 할당

var kmj = 'howdy-mj' // 변수 선언과 할당

-변수 선언 및 할당은 하나의 문(statement)로 축약할 수 있으나 실행 시점이 다르다. 변수 선언은 호이스팅되고 할당은 런타임에 일어난다.
=>변수의 할당과 console을 실행하는 위치에 따라 반환 값이 다르다.

console.log(kmj) // output: undefined

var kmj = 'howdy-mj'
console.log(kmj) // output: howdy-mj

변수에 재할당을 할 수 있으며 변경할 수 없는 값이라면 이는 변수가 아니라 상수(constant)라 한다.

console.log(kmj) // output: howdy-mj

kmj = 'mj'
console.log(kmj) // output: mj

클로져

world를 실행했을때 : 첫 콘솔은 블록 안에 정의된 30을 출력
world() 내부에 있는 value는 hello()값으로 정의되는데, hello 함수 안에 a 변수가 존재하지 않아 스코프 체인을 통해 가장 근접한 a에 접근, 전역변수로 정의된 a=10을 hello가 사용

만약 전역 변수 let a = 10이 지워진다면?
undefined인가? -> not defined에러

컴퓨터 입장에서 생각.
hello 함수 선언시 선언된 위치에서 파악해보면 된다. 선언 당시 이미 어떤 값을 쓸지 정해져 있으므로.
!! 변수의 이름에 현혹되면 안된다. 이름은 개발자가 짓는 것이니까.

world()앞에 값이 초기화 됐으면 hello는 10
world()뒤에 값이 초기화 됐으면 undefined
->함수 사용 전에 a의 값이 초기화 돼있으면 됨.

실행할때 값을 찾는 게 아니라 선언을 할 때 이미 어떤 값을 쓸지 정해져 있음.

profile
나는 나의 섬이다.

0개의 댓글