Javascript의 루프 변수 선언은 어디에 배치해야 하나요?
습관 1: 선언하지 않고 직접 사용
function loop(arr) { for (i = 0; i < arr.length; i++) { // do something } }
매우 위험한 사용 습관입니다. 일반적으로 루프 변수는 창 개체의 속성이 되어 전역적으로 사용되며 이는 프로그램의 일반적인 논리 구현에 영향을 미칠 가능성이 높습니다.
엄격 모드에서 변수를 선언하지 않고 직접 할당하면 예외가 직접 발생한다는 점을 언급하는 것이 중요합니다. ecma-262 표준 부록 C의 한 구절을 인용합니다:
"선언되지 않은 식별자 또는 해결 불가능한 참조에 대한 할당은 전역 객체에 속성을 생성하지 않습니다. 엄격 모드 코드 내에서 단순 할당이 발생하면 LeftHandSide는 해결 불가능한 참조로 평가되어서는 안 됩니다. 그렇게 하면 ReferenceError 예외가 발생합니다(6.2 .3.2)."
즉, 선언되지 않은 변수가 다시 사용되면 ReferenceError 예외가 발생합니다.
습관 2: for 루프의 초기 명령문 블록에 넣고
을 반복적으로 선언합니다.function loop(arr) { for (var i = 0; i < arr.length; i++ ){ // do someting } // console.log(i); for (var i = 0; i < arr.length; i++ ){ // do something else } }
이 방법이 가장 안전하고 표준화된 것 같습니다. C 및 Java에서 프런트 엔드 개발로 전환하는 많은 학생들이 이러한 작성 방법을 선호합니다. 실제로 이는 Javascript의 중요한 개념에 대한 오해 때문일 수 있습니다. 변수. C 및 Java와 달리 Javascript에는 실제 블록 수준 범위가 없습니다. 즉, 첫 번째 루프가 끝난 후 console.log(i)는 정의되지 않은 내용을 인쇄하거나 ReferenceError 예외를 발생시키지 않지만 정상적으로 인쇄됩니다. 도착 길이.
물론 이러한 작성 방식은 아름답다는 것 외에는 거의 의미가 없지만 오랫동안 호환되었으며 어떠한 사양도 위반하지 않습니다. ECMA 표준은 특정 범위에서 동일한 변수의 반복 선언을 금지하지 않습니다.
습관 3: 다른 변수와 함께 함수 상단의
을 중앙에서 정의하세요.function loop(arr) { var var1; var var2; var i; for (i = 0; i < arr.length; i++) { // do something } }
이 c89와 같은 변수 정의 방법은 Javascript에서 거의 완벽합니다. Javascript가 블록 수준 범위를 지원한다는 오해를 일으키지 않으며 전역 범위를 오염시키지 않으며 표준 및 사양을 위반하지 않는다는 단점이 있습니다. 루프 변수와 루프 본문이 멀리 떨어져 있을 수 있습니다. 더 많은 코드를 사용하지 않고는 주요 주류 브라우저 제조업체가 ECMAScript 6에서 let 키워드를 구현하기를 기다리는 것 외에는 이 문제에 대한 더 나은 해결책이 없는 것 같습니다.
습관 4: 루프 코드를 IIFE로 캡슐화하세요
function loop(arr) { (function () { for (var i = 0; i < arr.length; i++) { // do something } })(); }
마지막 습관은 IIFE(Immediately-Invoked Function Expression)로 프론트엔드 프로그래머들에게 친숙한 것으로 함수를 즉시 실행한다는 의미입니다. 이 방식의 가장 큰 단점은 작성하기가 상대적으로 번거롭고 불필요한 성능 손실(매우 작음)이 있지만 호환성 및 다양한 표준 준수 측면에서 좋은 성능을 발휘한다는 것입니다. 개발자는 너무 번거롭지 않다면 이 접근 방식을 사용할 수 있습니다.
위는 Javascript의 네 가지 일반적인 루프 변수 정의의 작성 습관에 대한 간략한 소개 및 분석입니다. 각각에는 고유한 장단점이 있습니다. 독자는 자신의 필요에 따라 가장 적합한 것을 선택할 수 있습니다.