UFO ET IT

여러 for 루프에서 동일한 변수 이름을 사용하는 것이 나쁜 습관입니까?

ufoet 2020. 12. 1. 20:10
반응형

여러 for 루프에서 동일한 변수 이름을 사용하는 것이 나쁜 습관입니까?


JSHint를 사용하여 JavaScript 코드를 린팅했습니다. 코드에는 다음과 같이 사용되는 두 개의 for 루프가 있습니다.

for (var i = 0; i < somevalue; i++) { ... }

따라서 두 for 루프 모두 반복을 위해 var i를 사용합니다.

이제 JSHint는 두 번째 for 루프에 대한 오류를 표시합니다 : " 'i'is already defined". 나는 이것이 사실이 아니라고 말할 수는 없지만 (분명히 그렇기 때문에) var i는 특정 장소에서만 사용되므로 항상 이것이 중요하지 않을 것이라고 생각했습니다.

이런 식으로 for 루프를 사용하는 것이 나쁜 습관입니까? 내 코드에서 각 for 루프마다 다른 변수를 사용해야합니까?

//for-loop 1
for (var i = 0; ...; i++) { ... }

//for-loop 2
for (var j = 0; ...; j++) { ... }

아니면 무시할 수있는 오류 중 하나입니까 (코드가 깨지지 않기 때문에 여전히 수행해야하는 작업을 수행하기 때문입니다)?

JSLint btw. 함수 맨 위에 var i를 정의하지 않았기 때문에 첫 번째 for 루프에서 유효성 검사를 중지합니다 (그래서 처음에 JSHint로 전환했습니다). 따라서이 질문의 예에 따르면 JSLint 또는 JSHint JavaScript 유효성 검사를 사용해야합니까? – 어쨌든 JSLint를 확인하려면 for-loops를 사용해야합니다.

...
var i;
...
//for-loop 1
for (i = 0; ...; i++) { ... }
...
//for-loop 2
for (i = 0; ...; i++) { ... }

이 방법은 JSLint와 JSHint의 오류를 모두 피해야하기 때문에 나에게도 좋습니다. 그러나 내가 불확실한 것은 다음과 같이 각 for 루프에 대해 다른 변수를 사용 해야하는지 여부입니다.

...
var i, j;
...
//for-loop 1
for (i = 0; ...; i++) { ... }
//for-loop 2
for (j = 0; ...; j++) { ... }

이에 대한 모범 사례가 있습니까? 아니면 위의 코드 중 하나를 사용하여 "내"모범 사례를 선택할 수 있습니까?


변수 선언이 표시되는 범위의 맨 위로 올라 가기 때문에 인터프리터는 두 버전을 동일한 방식으로 효과적으로 해석합니다. 이러한 이유로 JSHint 및 JSLint는 선언을 루프 이니셜 라이저 밖으로 이동하도록 제안합니다.

다음 코드는 ...

for (var i = 0; i < 10; i++) {}
for (var i = 5; i < 15; i++) {}

...은 다음과 같이 효과적으로 해석됩니다.

var i;
for (i = 0; i < 10; i++) {}
for (i = 5; i < 15; i++) {}

의 선언은 실제로 하나만 i있고 여기에 여러 할당 이 있다는 점에 유의 하십시오. 동일한 범위에서 실제로 변수를 "재 선언"할 수 없습니다.

실제로 질문에 답하려면 ...

이것에 대한 모범 사례가 있습니까 아니면 위의 코드 중 하나로 갈 수 있습니까?

이를 가장 잘 처리하는 방법에 대한 다양한 의견이 있습니다. 개인적으로 저는 JSLint에 동의하며 각 범위의 맨 위에 모든 변수를 함께 선언 할 때 코드가 더 명확하다고 생각합니다. 이것이 코드가 해석되는 방식이므로 작동하는 것처럼 보이는 코드를 작성하는 것이 어떻습니까?

그러나 여러분이 관찰 한 바와 같이, 코드는 취해진 접근 방식에 관계없이 작동하므로 스타일 / 컨벤션 선택이며 가장 편하게 느끼는 형식을 사용할 수 있습니다.


자바 스크립트의 변수는 함수 범위 (블록 범위가 아님)입니다.

var i루프에서 정의하면 루프와 해당 루프가있는 함수에도 그대로 유지됩니다.

아래를 참조하십시오.

function myfun() {
    //for-loop 1
    for (var i = 0; ...; i++) { ... }

    // i is already defined, its scope is visible outside of the loop1.
    // so you should do something like this in second loop.

    for (i = 0; ...; j++) { ... }

    // But doing such will be inappropriate, as you will need to remember
    // if `i` has been defined already or not. If not, the `i` would be global variable.
}

@TSCrowder의 주석 에서만 언급되었습니다 . 환경이 지원하는 경우 (Firefox, Node.js) ES6에서 선언을 사용할 수 있습니다.let

//for-loop 1
for (let i = 0; ...; i++) { ... }

//for-loop 2
for (let i = 0; ...; i++) { ... }

which limits the scope to within the for-loop. Bonus: JSHint stops complaining.


The reason JSHint shows the error is because in JS variable scope is function and variable declarations are hoisted to the top of the function.

In Firefox you can use let keyword to define block scope, but is not currently supported by other browsers.

The let keyword is included ECMAScript 6 specification.


I know this question has been answered, but if you want super for loops, write them like this:

var names = ['alex','john','paul','nemo'],
    name = '',
    idx = 0,
    len = names.length;

for(;idx<len;++idx)
{
    name = names[idx];
    // do processing...
}

A couple of things going on here...

  1. The array length is being stored in len. This stops JS evaluating names.length every iteration

  2. The idx increment is a PRE-INCREMENT (e.g. ++idx NOT idx++). Pre-increments are natively faster than Post-increments.

  3. The storing of a reference to name. This is optional but recommended if you'll be using the name variable a lot. Every call to names[idx] requires finding the index in the array. Whether this search be a linear search, tree search or hash table, the find is still happening. So store a reference in another variable to reduce lookups.

Finally, this is just my personal preference, and I have no proof or any performance benefits. However I always like initialising variables to the type they're going to be e.g. name = '',.


The best practice is to reduce the scope of variables, so the best way to declare iteration variable for the loops is

//for-loop 1
for (var i = 0; ...; i++) { ... }

//for-loop 2
for (var j = 0; ...; j++) { ... }

I know the scope of the variables declared with var but I am taking about code readability here.

참고URL : https://stackoverflow.com/questions/15783144/is-it-bad-practice-to-use-the-same-variable-name-in-multiple-for-loops

반응형