본문 바로가기

공부/TIL

실행컨텍스트

변수선언부분 let, const 구분, 상태구분

필터메소드는 다른배열을 리턴 (요소는 달라질 수 도 있을뿐) 주소는 다르다

context 문맥/맥락 변수는 식별자, 어디 스코프에 따라서 값이 달라진다

if(트루,폴스가 올장소인데 1이 와도 암묵적타입변환){}

스코프는 실행 컨텍스트에 의해 만들어진다

식별자:변수,함수,클래스명, 객체, (프로퍼티는 잘안부른다) 식별자는 스코프에 등록되지만 (스코프체인에서 찾음)

프로퍼티 (프로토 타입체인에서 찾음, 찾는곳이 다르다)

클로저가 어려운것은 실행컨텍스트가 없기 때문에

eval 코드(Eval code) 기존의 자바스크립트 엔진이 만들어놓은 스코프를 흔들어서 퍼포먼스가 안좋고

보안에도 안좋다

전역함수의 선언은 전역코드이지만, 전역함수 내에 코드는 함수코드이다

var키워드로 선언한 변수와, 함수 선언문으로 정의한 전역함수는 전역객체에 '직접' 등록

모든 식별자는 스코프 체인에서 찾는다 - 전역변수를 전역스코프에서 찾으면

전역변수가 없다 (var 키워드) 전역객체의 프로퍼티로 존재

전역변수처럼 그냥 쓰면, 자바스크립트 엔진이 전역객체에 가서 찾아서 써줌

let과 const로 선언한 전역변수는 '전역스코프'에 등록됨 그래서 window가 안됨

var x => x, window.x

const y => y

전역코드의 역할 (전역스코프를 만든다, 전역객체와 밀접한 관계를 갖는다)

->자바스크립트에만 존재, 다른언어들은 main이라는 진입점이 있음 메인함수 호출하면서 시작

함수코드의 역할(지역스코프를 만든다, 전역스코프를 최상단으로 하는 스코프 체인을 이루어야한다)

전역실행컨텍스트, 함수실행컨텍스트

자바스크립트엔진은 값, 코드를 평가한다

평가와 실행은 다르다 (실행되기전에 평가단계를 거친다)

평가의 아웃풋 = 실행컨텍스트 평가의 내용물(선언문들을 먼저 실행)

식별자들을 어디에 등록? 실행컨텍스트

var x = 10;

1전역코드를 평가(자바스크립트 엔진이) 선언문들만 쏙쏙빼냄

식별자 x를 등록해라 - > 전역실행컨텍스트(x등록)

실행컨텍스트 = 객체 (키,값) 키만 줄 수 없어서 값을 undefined

2.코드의실행(런타임)

할당을 할려면 뭐부터 해야하냐 ? 식별자와 값을 바인딩

->식별자를 찾아야된다 실행컨텍스트에 가서 아까넣은 x를 찾는다

없으면 reference에러 있으면 10을 넣는다

function foo(a){

var x = 10+a;}

1.전역코드의 평가부터 실행 (함수선언문) -> 전역실행컨텍스트(객체)에 등록

함수명을 변수명으로 만드는게 아니다(함수 표현식이 그런거고 애는 선언문)

함수명을 가지고 식별자를 만들어서 전역실행컨텍스트에 등록

평가되지마자 함수 객체를 즉석에서 만들어서 넣음

=함수는 객체이다 객체는 값이다(일급객체)

함수표현식이면 undefined

console.log(foo())란, 함수객체의 내부 프로퍼티이인 [[call]]을 부르는것이다

함수표현식으로 선언한 함수는 런타임에 함수객체가 된다

함수코드 평가할때, argument 객체도 들어온다(함수 객체만 갖고있는 프로퍼티)

유사배열 객체(length 프로퍼티) 함수의 매개변수없이 인수로 받으면 확인가능

실행컨텍스트란, 실행가능한 코드를 ''평가''하고 실행하기 위해 필요한 환경을 제공하고 코드의 "실행"결과를 실제로 관리하는 영역이다.

변수는 실행컨텍스트 객체의 프로퍼티

실행 컨텍스트 스택 = 콜스텍(하나) 어떠한 함수가 실행되고 있으면 뒤에 함수는 실행될 수 없다

js가 싱글스레드인이유: 이정도로 클지 몰랐다 ->코딩이 쉽게 하기 위해

전역실행컨텍스트는 불멸이다 (없어지면 이벤트핸들러에다가 담아놓은거 못함 애플리케이션 종료)

브라우저를 끄지 않는한 계속 존재

실행 컨텍스트 스택의 최상위에 존재하는 실행 컨텍스트를 **실행 중인 실행 컨텍스트(running execution context)**

렉시컬 Lex 어휘 문맥의 환경 = 렉시컬환경 스코프(자료구조 환경레코드)

렉시컬환경은 : 1환경레코드(값관리)

2외부렉시컬 환경에 대한참조(스코프체인을위한 상위스코프 참조)

3this바인딩 으로 구성되어 있다

전역평가 - >전역실행컨텍스트 객체(프로퍼티 2개 렉시컬환경을 가리키도록 푸쉬)

식별자를(선언문을 )끄집어내서 등록하기 시작

전역레시컬환경에 (환경레코드에 3개의 식별자를 등록하려고한다)

문제는 var,const

var로 선언된 객체환경레코드라는곳으로 들어간다 거기는 bindingobject인 브라우저라면 window

노드라면 global이고

const는 선언적 환경레코드에 들어간다 (전역객체와 연관이 없다)

함수선언문도 객체환경레코드를 거쳐 window의 메소드가 된다

= var와 전역함수는 window에 등록

ㅡㅡㅡㅡㅡㅡㅡㅡ전역코드 평가완료

함수는 자기가 선언된 지점에서 평가된다, (상위스코프가 결정된다)

foo함수 내부에서 선언된 bar함수는 foo함수의 코드가 평가될때 만들어진다(표현식이면 실행될때)

=자바스크립트의 모든 함수는 자신의 부모스코프를 기억하는 클로저다

화살표함수는 흡사 => a(.bind(this)) 와 비슷

반응형

'공부 > TIL' 카테고리의 다른 글

0610  (0) 2019.06.10
0607  (0) 2019.06.07
몽고db ,sass  (0) 2019.06.04
바벨,웹펙  (0) 2019.06.03
시험  (0) 2019.06.01