2012-04-18 4 views
10

나는 이것에 대한 논의를 읽었지만 찾을 수는 없을 것이라고 확신합니다. 간단히 말해, 루프의 선언 안에 for 루프의 증가를 선언하는 것이 단점입니까? 이것이 차이이다Javascript for 루프 선언 내에서 var 선언하기

function foo() { 
    for (var i=0; i<7; i++) { 
     // code 
    } 
} 

는 ... 이는 : JS 함수 범위를 갖기 때문에

function foo() { 
    var i; 
    for (i=0; i<7; i++) { 
     // code 
    } 
} 

이든 오른쪽 잘해야? 이전 접근법이 문제를 일으킬 수있는 첨단 사례가 있습니까?

동일하면 왜 Crockford/JSLint가 모두 "도대체 아니야?"라고하는 이유는 무엇입니까?

+2

[JavaScript 변수가 외부 또는 내부 루프를 선언 할 수 있습니까?] (http://stackoverflow.com/questions/3684923/javascript-variables-declare-outside-or-inside-loop) –

답변

12

이들은 완전히 동일합니다. 자바 스크립트의 모든 지역 변수는 함수 범위를 가지고 있습니다. 즉, 선언 된 전체 함수에 대해 살아 있음을 의미합니다. 대부분의 중괄호 언어는 선언 된 블록에 변수의 수명을 지정하기 때문에 처음에는 직관적이지 않습니다.

자바 스크립트 개발자 중 일부는 두 번째 형식을 매우 선호합니다. 그 이유는 모든 변수가 기능 범위를 가지고 있기 때문에 자바에 익숙하지 않은 사람들을 위해서라도 수명을 명시 적으로하기 위해 함수 수준에서 선언해야한다는 것입니다. 하지만 이것은 단지 스타일과 더 하드 규칙을

편집

주를 의미하여 ES6 let의 도입과 함께, 당신은 지금 당신의 루프 내주지 사용할 수있는 실제 블록 범위의 변수 more details

for(let i = 1; i <= 5; i++) { 
    setTimeout(function(){ 
     console.log('Value of i : ' + i); 
    },100); 
} 
+0

로컬 범위를 제공한다는 점에서'var'와 비슷한'let'도 있습니다 만 블록 범위를받는 점이 다릅니다. 'for' /'if' /'while' 외에서는 접근 할 수 없습니다. – 4castle

0

둘 모두 정확히 똑같습니다.

+0

매우 유용한 답변이 아닙니다. 문제는 그들이 기능적으로 동일하다는 점을 감안할 때 왜 JSLint의 규칙인가? JSLint는 다양성에 대해 놀라 울 정도로 까다 롭습니다. JSLint는 광범위하게 다양 할 수 있지만 그 광기에 대한 방법이 있습니다. –

+0

JSLint는 아무 의미가 없습니다. – Rob

+1

LOL 그것은 무언가를 의미합니다 ... 어쩌면별로는 아니지만 좋은 습관을 확립하는 데 도움이되는 멍청한 멍청이에게는. –

7

루프 헤더에 var으로 선언 할 때의 문제점은기만적인 것입니다.

var i = 1; 
function foo() { 
    console.log(i);      // 'undefined' 
    for (var i=1; i<100; ++i) { 
    } 
} 

console.log 호출 전에 발생하더라도 : 전에 선언을 포함 - 당신은 누구의 범위는 실제로 함수 내 어디에서나 존재하는 for 루프로 제한됩니다 변수를 선언하는 것 보이는 국부적으로 i의 선언, 그것은 동일한 기능 안에 있기 때문에 그것의 범위에 아직도있다. 따라서 할당 된 값이 아직없는 로컬 ilog으로 전달됩니다. 이것은 놀랄 수 있습니다. Javascript 범위 지정 규칙에 익숙하지 않은 사람에게는 확실하지 않습니다.

ECMAScript 2015으로 시작하는 변수를 선언하는 더 좋은 방법은 let입니다. let으로 선언 된 변수는 전체 함수가 아니라 해당 변수를 포함하는 블록에 대해 로컬입니다. 의도 한대로 따라서 위의 코드의 버전은 1을 인쇄합니다 :

let i=1; // could use var here; no practical difference at outermost scope 
function foo() { 
    console.log(i);    // 1 
    for (let i=1; i<100; ++i) { 
    } 
} 

그래서 현대 자바 스크립트의 가장 좋은 방법은 let 대신 var으로 변수를 선언하는 것입니다. 그러나 사전 ECMAScript 2015 구현에 문제가있는 경우 처음 사용할 때까지 기다리는 것이 아니라 함수 상단에 모든 변수를 선언하는 것이 다소 덜 혼란 스럽습니다.

+0

Js가 범위를 다루는 것에 익숙하다면 모든 것이 잘됩니다. –

+1

그래서 사람들은 'var'사용을 중지해야합니다. –

+0

알림을 보내 주셔서 감사합니다. @SartherisStormhammer. 현대 언어에서'let'의 가용성을 다루기 위해 업데이트되었습니다. –

1

가 차이가 없지만 명시 적 루프의 가능한 외부 가변 것을 알 수 있기 때문에 I는 (크록 포드 PER) 두 번째 방법을 선호 :

function() { 
    for(var i=0; i<7; i++) { 
     // code 
    } 

    // i is still in scope here and has value 7 
} 
0

개의 코드 블록이 동일하다. for 루프의 첫 번째 문은 for 루프가 시작되기 전에 실행되고 두 번째 문이 true 인 동안 루프가 실행되며 루프가 한 번 반복 될 때마다 세 번째 문이 실행됩니다.

for(var i = 0; i < 8; i++) { 
    //some Code 
} 

var i = 0; 
for(;i < 8;) { 
    //some Code 
    i++; 
} 

합니다 ((i < 8 실제로 번째 문장이 아닌 제 컴퓨터에게 인 다음 세미콜론)로 동일한 것을 의미한다.

관련 문제