범위는 모든 프로그래밍 언어에서 항상 가장 중요한 요소입니다. 변수와 매개변수의 가시성과 수명 주기를 제어하기 때문입니다. 말하자면, 먼저 블록 수준 범위와 함수 범위라는 두 가지 개념을 이해하세요.
블록 수준 범위란 무엇인가요?
중괄호 쌍({ 및 }) 안에 있는 모든 문 집합은 블록에 속하며, 여기에 정의된 모든 변수는 코드 블록 외부에서 볼 수 없습니다.
함수 범위는 이해하기 쉽습니다(*^__^*). 함수에 정의된 매개변수와 변수는 함수 외부에서 보이지 않습니다.
대부분의 C 계열 언어에는 블록 수준 범위가 있지만 JS는 그렇지 않습니다. 아래 데모를 참조하세요:
//C语言 #include <stdio.h> void main() { int i=2; i--; if(i) { int j=3; } printf("%d/n",j); }
이 코드를 실행하면 "정의되지 않은 변수를 사용하세요:j"라는 오류가 나타납니다. 보시다시피 C 언어에는 블록 수준 범위가 있습니다. j는 if 문 블록에 정의되어 있으므로 블록 외부에서는 액세스할 수 없습니다.
JS는 어떻게 작동하나요? 또 다른 데모를 살펴보겠습니다.
functin test(){ for(var i=0;i<3;i++){ } alert(i); } test();
이 코드를 실행하면 "3"이 나타납니다. 블록 외부에서는 블록에 정의된 변수에 계속 액세스할 수 있음을 알 수 있습니다. 즉, JS는 블록 수준 범위를 지원하지 않고 함수 범위만 지원하며, 함수 내 어디에서나 정의된 변수는 함수 내 어디에서나 볼 수 있습니다.
그렇다면 JS가 블록 수준 범위를 갖도록 하려면 어떻게 해야 할까요? 함수가 호출되면 함수에 정의된 변수가 삭제된다는 사실을 아직도 기억하시나요? 이 기능을 사용하여 JS의 블록 수준 범위를 시뮬레이션할 수 있나요? 아래 데모를 살펴보세요.
function test(){ (function (){ for(var i=0;i<4;i++){ } })(); alert(i); } test();
이때 다시 실행하면 "i" 정의되지 않은 오류가 뜹니다 ㅎㅎ 구현이 되었습니다~~ 여기서는 for 문 블록을 클로저에 넣은 후 이 함수를 호출합니다. 함수 호출이 완료되면 변수 i가 자동으로 소멸되므로 블록 외부에서 해당 변수에 접근할 수 없습니다.
JS의 클로저 기능은 가장 중요한 기능입니다((*^__^*) 다들 아시죠). JS에서는 이름 충돌을 방지하기 위해 전역 변수와 전역 함수의 사용을 피해야 합니다. 그렇다면 그것을 피하는 방법은 무엇입니까? 예, 위의 데모에서 볼 수 있듯이 정의하고 싶은 모든 것을
(function (){ //内容 })();
현재로서는 외부 레이어에 함수 범위를 추가하는 것과 동일합니까? 이 범위 밖의 프로그램은 해당 항목에 액세스할 수 없습니다.