[자바스크립트/Javascript] 렉시컬 스코프

cool_kim·2021년 7월 31일
0

Javascript

목록 보기
7/7
post-thumbnail

📌 스코프가 작동하는 두가지 방식

  1. 렉시컬 스코프
  2. 동적 스코프

💡 렉스 타임

렉시컬 스코프 : 개발자가 코드를 짤 때 변수와 스코프 블록을 어디서 작성하는가에 기초하여 렉서가 처리할 때 확정

//1
function foo() {
	//2
	var b = a * 2;
	function bar(c); {
		//3
		console.log( a, b, c);
	}
	bar( b * 3 )'
}
foo( 2 ); // 2, 4, 12

⇒ 3개의 중첩 스코프

  • 1 : 글로벌 스코프, foo 확인자
  • 2 : foo 스코프, a, bar, b 확인자
  • 3 : bar 스코프, c 확인자

📍 어떤 함수의 버블도 동시에 다른 두 스코프 버블 안에 존재할 수 없음



✅ 검색

: 엔진이 스코프 버블의 구조상대적 위치를 통해 어디를 검색해야하는지에 대한 정보

📍 스코프 : 목표와 일치하는 대상을 찾는 즉시 검색 중단
📍 섀도잉 : 여러 중첩 스코프 층에 걸쳐 같은 확인자 이름 정의
📍 렉시컬 스코프는 함수가 선언된 위치에 따라 정의

✅ 렉시컬 속이기

eval()

: 인자로 문자열을 받아 런타임에 문자열 내용을 코드의 일부분처럼 처리
→ 호출된 위치에 있는 렉시컬 스코프 수정

with

: 한 객체의 여러 속성을 참조할 때 객체 참조를 매번 반복하지 않기 위해 사용하는 속기법

function foo(obj) {
	with (obj) {
		a=2;
	}
}

var o1 = {
	a: 2
};

var o2 = {
	b: 3
};

foo( o1 );
console.log( o1.a ); //2

foo( o2 );
console.log( o2.a ); // undefined
console.log( a ); // 2--0ops, leaked global!

⇒ with 문은 o1이라는 스코프를 선언하고 그 스코프는 o1.a 속성에 해당하는 확인자를 가짐

⚠️ eval과 with모두 권장하지 않는 문이다
하지만 코드에 이 두개가 있다면 최적화 없이는 코드가 느리게 동작할거 라는 것 명심!

profile
FE developer

0개의 댓글