by leonardomso & jakeseo_me # #

6. Function Scope, Block Scope and Lexical Scope

전역 스코프(Global Scope)

// Don't do this!
var thing = 'something'
var thing = 'something else' // perhaps somewhere totally different in your code
console.log(thing) // 'something else'

우리는 전역변수 사용을 자제해야 합니다. 지역변수 사용을 지향합시다.

함수는 각자의 스코프에 접근할 수 없다

함수를 각각 선언했을 때, 함수는 다른 함수의 스코프에 접근할 권한을 갖고 있지 않습니다. 심지어 함수 내에서 다른 함수를 불러오더라도 스코프는 사용할 수 없습니다.

아래 예제에서, secondfirstFunctionVariable에 접근할 권한이 없습니다.

function first () {
	const firstFunctionVariable = `I'm part of first`;
}

function second () {
	first();
	console.log(firstFunctionVariable); // Error, firstFunctionVariable is not defined
}

내부 스코프(Nested Scope)

함수가 다른 함수 안에서 만들어졌고 안쪽 함수(inner function)는 바깥 함수(outer function)의 변수에 접근 가능합니다. 이러한 것을 어휘적 스코프(lexical scoping) 라고 합니다.

하지만 바깥 함수에게는 안쪽 함수의 변수에 접근할 권한이 주어지지 않습니다.

function outerFunction () {
	const outer = `I'm the outer function!`;

    function innerFunction() {
    	const inner = `I'm the inner function!`;
        console.log(outer) // I'm the outer function!
    }

  console.log(inner); // Error, inner is not defined
}

스코프가 어떻게 작동하는지 시각화하기 위해서는 안에서는 바깥이 보이지만 바깥에서는 안이 보이지 않는 유리(one-way glass)를 생각하시면 쉽습니다.

https://user-images.githubusercontent.com/24728385/105340544-5edab600-5c21-11eb-8d9b-8354e44913cf.png

클로져(Closures)