함수의 매개변수는 함수 몸체 내에서만 참조 가능하고, 함수 밖에서 참조할 수 없다고 했다.
이는 매개변수의 유효범위가, 즉 매개변수의 스코프가 함수 몸체 내로 한정되어있기 때문이다.
function add(x,y){
//매개변수는 함수 몸체 내부에서 참조 가능
//매개변수의 스코프는 함수 몸체 내이다.
console.log(x,y); //2 5
return x + y;
}
add(2,5);
console.log(x,y); //ReferenceError
변수는 함수 안에서, 코드 가장 바깥영역이나 코드 영역에서도 선언 가능하다.
이떄 코드 블록이나 함수는 중첩 가능하다.
var var1 = 1; //코드의 가장 바깥 부분
if(true){
var var2 = 2; //코드 블록 내에서 선언한 변수
if(true){
var var3 = 3; //중첩된 코드 블록 내에서 선언한 변수
}
}
function foo(){
var var4 = 4; //함수 내에서 선언한 변수
function bar(){
var var5 = 5; //중첩된 함수 내에서 선언한 변수
}
}
console.log(var1); //1
console.log(var2); //2
console.log(var3); //3
console.log(var4); //ReferenceError
console.log(var5); //ReferenceError
변수는 자신이 선언된 위치에 따라, 자신이 유효한 범위, 즉 다른 코드가 자신을 참조할 수 있는 범위가 달라지게 된다.
변수가 아니라 모든 식별자가 마찬가지다.
즉, 모든 식별자는 자신이 선언된 위치에 의해, 다른 코드가 자신을 참조할 수 있는 유효범위가 달라진다.
이것을 스코프라고 한다. 즉 스코프는 식별자가 유효한 범위이다.
var x = 'global';
function foo(){
var x = 'local';
console.log(x); //1-'local'
}
foo();
console.log(x); //2- 'global'
코드의 가장 바깥영역과 foo 함수 내부에 같은 이름을 갖는 x변수를 선언했고,
1과 2에서 각각 변수를 참조한다.