1. 지역변수를 먼저 사용한 후 선언하므로, 같은 이름의 외부변수에는 영향을 미치지 않습니다.
다음과 같이 코드 코드를 복사합니다.
var x = 1; // --> 외부 변수 x
함수 fn(){
Alert(x); // --> 정의되지 않은 지역 변수 x가 먼저 사용됩니다.
var x = 2; // 나중에 선언하고 할당합니다.
}
fn();
경고(x); // --> 1<BR>
첫 번째 요점은 함수 fn의 첫 번째 문장이 x를 출력하고 x가 두 번째 문장에서 정의된다는 것입니다. 이는 JS에서 허용되며 여기서 허용된다는 것은 프로그램이 구문 오류 없이 실행될 수 있음을 의미합니다.
하지만 C, Java 등 다른 언어에서는 허용되지 않습니다. 변수는 사용하기 전에 선언해야 합니다.
다음과 같이 코드 코드를 복사합니다.
공개 클래스 테스트 {
공개 정적 무효 메인(String[] args) {
System.out.println(x); //먼저 사용
int x = 10; // 선언 후
}
}
Java에서는 컴파일러가 오류 메시지를 표시하고 프로그램을 실행할 수 없습니다.
두 번째 요점은 함수 fn 내의 지역 변수 x가 외부 변수 x에 영향을 미치지 않는다는 것입니다. 즉, fn의 경고 출력은 1이 아니라 정의되지 않았습니다.
둘째, 형식 매개변수는 함수 이름보다 우선순위가 높습니다.
다음과 같이 코드 코드를 복사합니다.
함수 fn(fn){
경고(fn);
}
fn('안녕하세요'); // --> "안녕하세요"
함수 이름과 형식 매개변수의 이름이 fn과 동일하고 출력이 "hello" 문자열이지만 fn 함수의 함수 본문(fn.toString())이 아님을 알 수 있습니다.
셋째, 형식 매개변수는 인수보다 우선순위가 높습니다.
다음과 같이 코드 코드를 복사합니다.
함수 fn(인수){
경고(인수);
}
fn('안녕하세요'); // --> "안녕하세요"<BR>
인수 객체는 함수 내에서 직접 사용할 수 있으며 언어 자체에서 제공하는 특수 식별자입니다.
여기서는 형식 매개변수가 동일한 이름으로 선언되는 일이 발생합니다. 출력이 "[object Object]" 대신 "hello"임을 알 수 있습니다. 즉 형식 매개변수 인수는 언어 자체에서 제공하는 실제 인수를 포함합니다.
4. 형식 매개변수는 선언되었지만 할당되지 않은 지역 변수보다 우선순위가 높습니다.
다음과 같이 코드 코드를 복사합니다.
함수 fn(a){
var a;
경고(a);
}
fn('안녕하세요'); // --> "안녕하세요"
함수 fn의 형식 매개변수는 a입니다. 함수의 첫 번째 문장은 지역 변수 a만 선언하고 값을 할당하지 않습니다. 출력 결과가 정의되지 않은 것이 아니라 "hello"라는 점에서 형식 매개변수 a가 선언만 되어 있고 값이 할당되지 않은 지역 변수 a보다 우선순위가 높다는 것을 알 수 있습니다.
5. 선언되고 할당된 지역 변수는 형식 매개변수보다 우선순위가 높습니다.
다음과 같이 코드 코드를 복사합니다.
함수 fn(a){
var a = 1;
경고(a);
}
fn('안녕하세요'); // --> "1"
함수 fn의 형식 매개변수는 a입니다. 함수의 첫 번째 문장은 지역 변수 a를 선언하고 값 1을 할당합니다. 출력 결과가 "hello" 대신 "1"인 것을 보면, 선언되고 할당된 지역 변수 a가 형식 매개변수 a보다 우선순위가 높다는 것을 알 수 있습니다.
6. 같은 이름의 지역 변수에 형식 매개변수를 할당하는 경우
다음과 같이 코드 코드를 복사합니다.
함수 fn(a){
var a = a;
경고(a);
}
fn('안녕하세요');
아직 실행하지 말고 결과를 추측해 보세요. 포인트 5를 따르는 경우: 선언되고 할당된 지역 변수는 형식 매개변수보다 우선순위가 높습니다. 그러면 a는 정의되지 않습니다. 그러나 실제로 a는 "hello"입니다. 즉, 오른쪽 a는 형식 매개변수 a이고 왼쪽 a는 지역 변수 a입니다.
여기서 두 개의 a는 서로 간섭하지 않으며 어느 쪽도 서로를 덮지 않습니다. 이는 제가 방금 말한 것과 모순됩니다. 할당된 지역 변수는 형식 매개변수보다 우선순위가 높습니다. 하지만 엔진은 우리가 원하는 대로 작동합니다. 왜냐하면 우리는 var a = a 이후에 a가 정의되지 않는 것을 원하지 않기 때문입니다.