단어의 뜻에서 알 수 있듯이 범위라는 뜻을 가지며
프로그래밍에선 ‘식별자에(를) 접근(참조) 가능한 범위’ 라고 할 수 있다.
const animal = 'dog';
let fruit = 'apple';
var address = 'LA';
function helloWorld(){};
위의 변수, 함수 모두를 식별자라 한다.
고로! 변수 , 함수가 참조될 수 있는 범위 라고 보면 될것 같다.
var hello = 'Hello';
console.log(hello); // => 'Hello'
function globalScope () {
console.log(hello);
hello = 'Hi My name is Joo'
console.log(hello);
}
globalScope(); // => 'Hello' ,'Hi My name is Joo'
console.log(hello); // => 'Hi My name is Joo'
위 코드에서 ‘hello’ 는 함수 밖에서 선언되었으나 ‘globalScope’ 함수 내부에서 접근했으며 ‘globalScope’함수가 실행되면 처음엔 함수 밖에서 할당된 ‘Hello’ 가 콘솔에 출력된 후 함수내에서 변수 ‘hello’가 가지는 값이 재할당 되어 출력되는것을 확인해 볼 수 있다.
이것이 가능한 이유는 함수 밖에서 선언한 hello는 전역변수로 선언되었기 때문이다.
function localScope() {
var hello = 'Hi My name is Joo'
console.log(hello);
}
localScope(); // => 'Hi My name is Joo'
console.log(hello); // => Uncaught ReferenceError ReferenceError: hello is not defined
반대로 ‘localScope’ 함수 안에서 선언된 변수 ‘hello’는 함수를 실행시켜보면 함수 내에서 할당된 값과 같은 변수 ‘hello’ 의 값을 콘솔로그를 확인할 수 있다.
하지만 직접 함수내에서 선언된 변수 ‘hello’ 를 콘솔로그로 확인하려 하면 참조오류가 발생하고, 변수 ‘hello’ 는 정의 되지 않았다는 문구를 볼 수 있다.
이는 함수내에서 선언된 변수는 local Scope (지역변수)의 하나인 function Scope(함수 스코프) 이기 때문이다.
*{} ⇒ if문( if(){}
), 반복문 ( for(){}
), 객체 ( {a = 1, b =2}
), 함수 ( function a(){}
)
var a = 1;
{
var a = 5;
console.log(a); // => 1
}
console.log(a); // => 1
let z = 1;
{
let z = 5;
console.log(z); // => 5
}
console.log(z); // => 1
const animal = 'eagle';
function what() {
let animal = 'dolphin';
console.log(animal); // => 'dolphin'
function kind() { // 내부함수
animal = 'tiger';
console.log(animal);
}
kind(); // => 'tiger'
}
what(); // =>
console.log(animal);
const animal = 'eagle';
) 와 상관 없이 함수 내에서 이름이 중복되는 변수를 선언하여 사용이 가능하다는 것을 알 수있다.const animal = "eagle";
function what() {
console.log(animal);
}
function kind() {
const animal = "tiger";
what();
}
what(); // => 'eagle'
kind(); // => 'eagle'
function dynamicScopeTest() {
console.log(z);
}
function dynamicScopeMain() {
var z = 'hello';
dynamicScopeTest();
}
var z = 'hi'
dynamicScopeMain(); // => 'hi'
var z = 'hi'
이후에 함수dynamicScopeMain가 실행 되며, ‘hi’ 를 출력하는 것을 볼 수 있다.전역변수의 사용은 변수 이름 중복 가능성이 있다.
또한 의도치 않은 재할당으로 코드를 어지럽게 하므로 사용을 지양해야한다.
const Animal = {};
Animal.sky = {
name: 'eagle',
food: 'meat',
}
console.log(Animal.sky.name); // => 'eagle'
(function () {
const Animal = {};
Animal.sky = {
name: "eagle",
food: "meat",
};
console.log(Animal.sky.name); // => 'eagle'
})();
console.log(Animal.sky.name); // => ReferenceError ReferenceError: Animal is not defined