0%

스코프

스코프

식별자(변수)가 유효한 범위,식별자와 깊은 관련,함수와 관련
어떨때 유효하고 어떨때 유효하지 않은가?
함수는 스코프를 만든다.(var키워드로 선언한 경우)

var 키워드는 함수의 코드블록만을 코드 블록으로 인정하는 함수레벨 스코프를 따른다. var 키워드는 함수가 스코프를 만든다.

중첩함수-스코프도 중첩이 된다.(어떤 우선순위를 가지는 가?을 아는 것이 중요)
스코프는 간단하게 말하면 자바스크립트엔진이 식별자를 찾는 규칙이다.

1
2
var a=1;
//선언하고 할당할때 a라는 식별자를 찾는다.

즉 스코프는 식별자에 존재한다. 프로퍼티는 prototype체인에 존재한다.

스코프의 생명주기
함수에 매개변수가 업ㄱ다면 외부와 단절이 된다. 하지만 매개변수는 없는 것이 가장 좋다.->외부에 의존하기 때문에

함수는 재사용을 한다. 변수를 왜쓰는가?-어떤 상태를 유지해야할때 사용한다.
변수를 공용으로 쓸때는(전역변수와 관련하여)? 고정되어 변하지 않는 값ㅇ르 가지는 경우에 사용한다.
상수는 재할당을 금지시킨다. 따라서 전역변수는 상수개념이 아니면 사용하지 않는것이 좋다.

1.순수함수-1언제나 동일 한 반환값(return x+y)
x(2,3)=5

2.비순수함수 -외부함수에 영향을 받음

1
2
3
4
var num=0;
function increase(){
return ++num;
}

스코프 함수

변수가 어디에서 선언이 됐느냐가 즉 선언 위치가 스코프를 만든다.
class는 함수이다.
자신이 선언된 위치에 의해 다른 식벼자를 참조할 유효범위가 결정된다.

function foo(){}는 식별자가 2개이다. 1.암묵적으로 자바스크립트 엔진이 변수이름으로 만든 식별자.

2.지역함수의 식별자. 그런데 에러를 일으키지않는다. 그리고 foo는 전역 함수이다. 또한 호출하는 foo()에서 foo는 함수이름이 아니고 자바스크립트엔진이 생성한 암묵적인 식별자다.

스코프는 자카스크립트엔진이 식별자는 찾는 규칙이다. 코드와 가장 근접한 곳에있는 스코프를 본다.
자바스크립트 코드의 문맥과 환경이있따. 코드를 실행하기 위한 문맥을 기억한다. 자바스크립트는 전역과 지역을 어떻게 구분하는걸까?

식별자는 스코프내에서 유니크하다.
전역은 어디근 참조(문맥을 찾는다.)가 가능하다. 코드가 해당하는 스코프부터 식별자를 찾는다. 그후에 상위로 간다.
쉐도잉-그림자 처럼 가져려진다.
식별자는 자바스크립트엔진에 등록이된다.
이때 스코프가 정해진다.
식별자는 스코프 체인에서 찾는다. 함수는 변수와 저장되는 매카니즘이 같다. 찾는 매카니즘도 동일하다.

렉시컬 시코프
자바스크립트엔진이 함수를 정의할때 어디서 호출될지 알수없다.
언제 함수의 상위 스코프가 오는냐? 함수의를 할때 취치에 의해 상위 스코프가정해진다. 어디서 호출되든지 간에 정의위치에 ㄱ따라 사우이스코프가 정해져버린다.
동적스코프와 /렉시컬스코프의 차이

매개변수가 값을 할당하는 것은 호출할때, 호출된 직후 매개변수undefined 선언된다. 이후에 할당된다.
변수도 어디에서 선언되는지에 따라 스코프가 정해진다.함수도 마찬가지

암묵적 전역변수
전역함수에서 선언하지않은 변수는 전역변수가 된다.
모듈(자바스크립트 엔진은 파일 스코프를 가지지않는다.)->한개의 파일로 함ㅍ쳐진다. 같은 이름의 변숙가 있다면 재할다잉 된다.이런 문제 따문에 전역변수를 사용하지않는다.
자바스크립트에는 순서가 있다.엄청 여러개의 스크립트파일들을 webpack 번들링 로 하나로 묶고 그 안에서 스코프를 줘서 나눈다.

변수의 생명주기- 변수 생명주기는 직역변수일때 함수의 생명주기가 짧다.리소스가 빨리 해방이 된다.
반대로 전역변수의 생명주기(스코프가 길다.)는 길기 때문에 재할당 수정등의 여러가지 문제를 야기한다.

짧고 생명주기가 짧은 함수가 가독성이 좋다. 그리고 한가지 일만 을 시킬수있어서 좋다.

전역변수의 생명주기는 스크립트 로드가 되자마자 생성되고 애플리케이션이 종료될때 까지 (브라우저 종료) 전역변수는 리소스 할당이 적다.,암묵적 결함을 하고,네이밍스페이스를 오염시킨다.

모둘패턴 (문법이 아닌 디자인 패턴이다.)
즉시실행함수는 코드가 실행되면 바로 실행이 된다. 객체 리터럴이 바로 함수에 할당이 된다. 모듈패턴은 자바스크립트에는 자바에서 public,private,protected같은 접근제한자가 없다. 따라서 이를 상요함으로써 변수에 접근을 하지못하게하는 역할을 하기위해 사용한다.
let,const 블록레벨 스코프

var키워드는 전역 변수의 분제점으로 귀결된다. 왜var키워드를 사용할 수없는가?->함수레벨 스코프,전역변수 문제점,재할당 등의 이유.

변수 호이스팅은 나쁜점이다. 지양해야하는 부분.
변수는 선언하고 참조해라

let/const 변수 선언 중복선언애러,변수는 스코프가 분리되있으면 다른 변수이다.

for문()의 소괄호의 부분은 코드블록안에 있다고 생각을 하는 것이 좋다.

const/let은 호이스팅이 안하는 것 처럼 보이지만 한다.-런타임이전에 변수는 선언이 된다. 하지만 런타임에 선언문을 만나야지 값이 할당된다. 그렇기 때문에 선언문이전에 호출을 하면 에러를 발생시킨다. 즉 선언된 것을 자바스크립트엔진이 알지만 이에 접근하지 말라는 의미다.

전역객체

브라우저의 전역객체는 :window이다.
node.js의 전역객체는 :gloabal이다.
var키워드로 선언한 모든 전역변수는 window객체릐 프로퍼티가 된다.

브라우저의 페이지를 바꾸면 전역객체또한 리셋이 된다.
전역객체는 var키워드로 선언한다.
function foo(){}와 var foo=funciton(){}모두 window의 객체이다.

let으로 선언한 전역변수는 더이상 읽어들을 전역변수가 없다면 생명주기를 다하고 죽는다.
var와 let키워드를 섞어서 사용하지만고 한가지만을 통일해서 사용하자.
window객체의프로퍼티는 전역변수와 같게 사용 할 수 있다.

const키워드
재할당을 할수없다. 변수 선언과 동시에 값을 할당해 주어야한다.
상수도 변수이다. 재할당을 금지시킨다.(스네이크 케이스,대문자로 사용한다.).

const 키워드의 객체
재할당을 하는 일은 극히 드물다.
대부분 변수 const 사용한다. 변수 재할당 할일 이 없다.
객체는 변경가능한 값이다. 객체를 가지는 변수는 let을 사용할 이유가 없다. 객체는 기본적으로 재할당하지 않는다. es6/const ,let을 사용한다. 재할당 필요한 경우에만 let을 사용한다.

전역 코드의 실행이 종료되면 let종료,window는 살아있다. 완료값은 변수에 할당되는 값이 아니다.