함수의 매개변수는 함수 몸체 내에서만 참조 가능하고, 함수 밖에서 참조할 수 없다고 했다.

이는 매개변수의 유효범위가, 즉 매개변수의 스코프가 함수 몸체 내로 한정되어있기 때문이다.

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에서 각각 변수를 참조한다.