programing

JavaScript 변수는 외부 또는 내부 루프를 선언합니까?

randomtip 2022. 9. 30. 09:44
반응형

JavaScript 변수는 외부 또는 내부 루프를 선언합니까?

AS3에서는 성능을 높이기 위해 루프 외부의 모든 변수를 초기화해야 한다고 생각합니다.JavaScript도 마찬가지입니까?어떤 것이 더 나은가/빠른가/베스트 프랙티스인가?

var value = 0;

for (var i = 0; i < 100; i++)
{
    value = somearray[i];
}

또는

for (var i = 0 ; i < 100; i++)
{
    var value = somearray[i];
}

JavaScript나 ActionScript는 의미나 성능 면에서 전혀 차이가 없습니다.

var는 파서의 명령어이며 런타임에 실행되는 명령어가 아닙니다.특정 식별자가 선언된 경우var1회 이상 기능 본문 내의 임의의 장소)에서 해당 ID를 사용하는 것은 모두 로컬 변수를 참조합니다.여 it it value is is is is is is is is is is is is로 var루프 내부, 루프 외부 또는 둘 다입니다.

따라서 가장 읽기 쉽다고 생각되는 것을 써야 합니다.나는 모든 대표팀을 함수의 정상에 두는 것이 항상 최선이라는 크록포드의 의견에 동의하지 않는다.에는 코드 에 있는 변수를 선언하는 var이 섹션은 독립되어 복사 붙여넣기가 가능합니다. 이외의 경우는, 붙여진 「」를 , 리팩터링중에 합니다.var그리고 당신은 우연히 글로벌하게 된거죠.

특히:

for (var i; i<100; i++)
    do something;

for (var i; i<100; i++)
    do something else;

는 두 Crockford를 할 것을 합니다.var 둘 다 한다)var 을 실행합니다.var i;jslint라는 노래입니다.는 둘 다 더 .vars: 함수 상단에 추가되고 쉽게 풀 수 있는 비트가 있는 대신 모든 관련 코드를 함께 유지합니다.

으로 인인 as as as as as as as as as as라고 하는 경향이 .var나로서는 선언을 해야 var전혀 바람직하지 않은 JS 사마귀이다(변수를 로컬로 디폴트하는 것이 좋았을 것이다).JavaScript에서도 ANSI C의 [오래된 리비전의] 제한을 복제하는 것은 제 의무라고 생각하지 않습니다.

(*: 중첩된 함수 본문 이외)

언어에는 블록 스코프가 없고 함수 스코프만 있기 때문에 이론적으로 자바스크립트에는 차이가 없습니다.

퍼포먼스 논쟁에 대해서는 잘 모르겠지만 더글라스 크록포드는 여전히 추천하고 있습니다var문장은 기능 본문의 첫 번째 문장이어야 한다.JavaScript 프로그래밍 언어의 코드 표기법에서 인용:

JavaScript에는 블록 범위가 없기 때문에 블록에 변수를 정의하면 다른 C 패밀리 언어에 익숙한 프로그래머를 혼동할 수 있습니다.함수의 맨 위에 모든 변수를 정의합니다.

다음 예에서 볼 수 있듯이, 나는 그가 옳다고 생각한다.맨에 변수를 선언한다고 해야 .i의 범위 내에서 .for프프: :

function myFunction() {
  var i;    // the scope of the variables is very clear

  for (i = 0; i < 10; i++) {
    // ...
  }
}

ECMA-/Javascript 어 languagehoists함수의 맨 위에 선언된 모든 변수입니다.왜냐하면 이 언어는function scope없음block scope다른 많은 C형 언어들처럼요.
'일명 '일명 '일명'입니다.lexical scope.

만약 당신이 신고한다면...

var foo = function(){
    for(var i = 0; i < 10; i++){
    }
};

되면...hoisted 삭제:

var foo = function(){
    var i;
    for(i = 0; i < 10; i++){
    }
}

따라서 성능에는 아무런 차이가 없습니다(단, 제가 완전히 틀렸다면 정정해 주십시오).
함수의 맨 위가 아닌 다른 곳에 변수를 선언하지 않는 훨씬 좋은 논거는 가독성입니다.내의 변수 선언for-loop는 이 변수가 루프 본체 내에서만 액세스할 수 있다는 잘못된 가정을 초래할 수 있습니다.이것은 완전히 잘못된 것입니다.현재 범위 내 어디에서나 해당 변수에 액세스할 수 있습니다.

내년에는 모든 브라우저에 코드를 미리 컴파일하는 JS엔진이 탑재되기 때문에 성능 차이(같은 코드 블록을 반복해서 해석하고 할당을 실행함으로써 발생하는 것)는 무시해도 될 것입니다.

또한 필요한 경우를 제외하고는 성능을 최적화하지 마십시오.변수를 처음 필요한 위치에 가깝게 유지하면 코드가 깔끔하게 유지됩니다.부정적인 측면은 블록 스코프가 있는 언어에 익숙한 사람들은 혼란스러울 수 있습니다.

한 가지 고려사항이 있는데, .let ★★★★★★★★★★★★★★★★★」constES2015에서는 루프 블록에만 변수를 적용할 수 있습니다.따라서 루프 외부에 동일한 변수가 필요하지 않는 한(또는 각 반복이 이전 반복에서 해당 변수에 대해 수행된 연산에 의존하는 경우) 이 작업을 수행하는 것이 좋습니다.

for (let i = 0; i < 100; i++) {
    let value = somearray[i];
    //do something with `value`
}

나는 방금 크롬으로 간단한 테스트를 했다.브라우저의 바이올린을 사용해 보고 결과를 확인합니다.

  var count = 100000000;
    var a = 0;
    console.log(new Date());

    for (var i=0; i<count; i++) {
      a = a + 1
    }

    console.log(new Date());

    var j;
    for (j=0; j<count; j++) {
      a = a + 1;
    }

    console.log(new Date());

    var j;
    for (j=0; j<count; j++) {
        var x;
        x = x + 1;
    }

    console.log(new Date());

그 결과 마지막 테스트는 최대 8초, 이전 2초만 소요됩니다.순서와 상관없이 매우 반복적입니다.

그래서, 이것은 나에게 증명한다. 사람은 항상 루프를 벗어나서 대표팀을 선언해야 한다.가 처음으로 은 신기한 다.i 스테이트먼트.for로 합니다.이것은 제가 지수를 미리 선언한 두 번째 테스트와 같은 속도로 보입니다.

JavaScript는 C와 C++ 중 어느 쪽인지 잘 모르겠습니다.그 목적 중 하나는 내장 메모리를 취급하는 수고를 덜어주는 것입니다.C 또는 C++에서도 루프 내에서 변수가 선언되면 리소스가 많이 소비될지 걱정할 필요가 없습니다.JavaScript에서 걱정할 필요가 있는 이유는 무엇입니까?

가독성과 성능을 모두 조합하는 것을 선호합니다.따라서 변수 내부 루프를 선언하는 것이 가장 좋습니다. 즉, 블록 스코프의 캡슐화가 필요합니다.

for (let i = 0, sum = 0; i < count; i++) { // count also be declared here like count = array.length;
  sum = sum + 1;
}

이전에 제공된 바이올린 성능 테스트에 따르면 승자는 4번입니다.

음, 그건 당신이 무엇을 이루려고 노력하느냐에 따라 다르겠지만...value루프 블록 내부의 임시 변수일 경우 두 번째 형식을 사용하는 것이 훨씬 명확합니다.그것은 또한 더 논리적이고 장황하다.

루프 내부 또는 외부에 변수를 선언해도 차이가 없습니다.테스트하는 샘플코드는 다음과 같습니다.

function a() {
   console.log('Function a() starts');
   console.log(new Date());
    var j;
    for (j=0; j<100000000; j++) {
        var x;
        x = x + 1;
    }
    console.log(new Date());
    console.log('Function a() Ends');
}
a()
function b() {
console.log('Function B() starts');
   console.log(new Date());
    var a;
    var j;
    for (j=0; j<100000000; j++) {
      a = a + 1;
    }
    console.log(new Date());
    console.log('Function B() Ends');
}
b()

내 경우 결과가 나타났다.

Function a() starts
VM121:3 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:9 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:10 Function a() Ends
VM121:14 Function B() starts
VM121:15 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:21 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:22 Function B() Ends

감사합니다.MyFavs.in

여기서의 질문은 기본적으로 루프 내의 변수를 선언하는 것입니다.이렇게 하면 어떻게 되는지 생각해 보세요.

var a = 30;
var a = 50;
var a = 60;

이게 맞을까요?아니요... 변수를 너무 많이 선언하지 않기 때문입니다.루프 내에서 변수를 선언하면 루프가 실행되는 횟수만큼 선언되지 않습니까?분명히 당신이 '엄격 사용' 모드에 있을 때 그것은 당신을 때릴 것이다.사람들은 원래의 질문에 대해 생각하지 않고 크록포드의 의견에 동의하지 않았다.

그래서 항상 위에 변수를 선언하는 것이 좋습니다.1. 가독성을 위해서 2. 좋은 습관을 들이는 것.

Linux OS 상에서 Chrome, Firefox 및 jsperf에서 테스트를 실행한 후의 퍼포먼스에 관해서는 루프 내 변수 선언과 루프 외 변수 선언 사이에 성능 차이가 있는 것 같습니다.이는 작은 차이이지만 반복의 양 및 변수 선언의 양으로도 복합됩니다.

따라서 최상의 성능을 위해 루프 외부에 변수를 선언하는 것이 좋습니다.또는 변수가 일치함을 선언하는 것이 좋습니다.예를 참조해 주세요.

// inline
for (var ai = 0, al = 100000000, av; ai < al; ai++) {
    av = av + 1;
}

// outside
var bv;
var bl = 100000000;
for (var bi = 0; bi < bl; bi++) {
    bv = bv + 1;
}

변수 'al'과 'av'가 for loop 선언 행에 어떻게 포함되어 있는지 주의해 주세요.이 인라인 선언으로 일관되게 퍼포먼스가 향상되었습니다.루프 외부에 있는 변수 선언도 마찬가지입니다.다시 말하지만 성능 차이는 매우 작습니다.

https://jsperf.com/outside-inline-for-loop-ase/1

언급URL : https://stackoverflow.com/questions/3684923/javascript-variables-declare-outside-or-inside-loop

반응형