UFO ET IT

JSLint가 "var 문이 너무 많다"고 말하는 이유는 무엇입니까?

ufoet 2020. 11. 23. 20:40
반응형

JSLint가 "var 문이 너무 많다"고 말하는 이유는 무엇입니까?


JSLint (onevar 플래그가 켜져 있음)는 다음과 같은 일부 자바 스크립트 코드에 플래그를 지정합니다.

5 행 문자 15의 문제 : var 문이 너무 많습니다.

이 오류를 고쳐서 기쁘지만 성능을 위해 수행하고 있는지 또는 나쁜 습관이며 내 자바 스크립트 코드에 버그를 도입 할 가능성이 더 크기 때문에 알고 싶습니다. onevar 플래그 뒤에있는 이유는 무엇입니까?

var 키워드에 대한 JSLint 문서를 살펴 보았지만 동일한 함수의 여러 var 문이 왜 나쁜지에 대해서는 구체적으로 설명하지 않습니다.

여기에 한 가지 시도가 있습니다. 하나의 var 문만 있으면 코드가 어떻게 이점을 얻을 수 있는지 설명하십시오.

function Test(arg) {
   var x = arg + 1,
       y = cache.GetItem('xyz');
   if (y !== null) {
      // This is what would cause the warning in JSLint
      var request = ajaxPost(/* Parameters here */);

   }
}

자바 스크립트에는 블록 범위가 없습니다. 다른 언어 (예 : c)에서 if 문에서 변수를 선언하면 변수 외부에서 액세스 할 수 없지만 자바 스크립트에서는 가능합니다. JSLint의 작성자는 사용자 (또는 다른 독자)가 혼란스러워하고 더 이상 변수에 액세스 할 수 없다고 생각할 수 있지만 실제로는 할 수 있기 때문에 이것이 나쁜 습관이라고 생각합니다. 따라서 함수 맨 위에 모든 변수를 선언해야합니다.


공식적인 이유 Douglas Crockford의 여기 입니다.

인용하려면 :

많은 언어에서 블록은 범위를 도입합니다. 블록에 도입 된 변수는 블록 외부에서 볼 수 없습니다.

JavaScript에서 블록은 범위를 도입하지 않습니다. 함수 범위 만 있습니다. 함수의 어느 곳에서나 도입 된 변수는 함수의 모든 곳에서 볼 수 있습니다. JavaScript의 블록은 익숙한 구문이 잘못된 약속을하기 때문에 숙련 된 프로그래머를 혼란스럽게하고 오류를 유발합니다.

JSLint는 function, if, switch, while, for, do 및 try 문이있는 블록을 기대합니다.

블록 범위가있는 언어에서는 일반적으로 처음 사용하는 사이트에서 변수를 선언하는 것이 좋습니다. 그러나 JavaScript에는 블록 범위가 없기 때문에 함수의 모든 변수를 함수 맨 위에 선언하는 것이 현명합니다. 함수 당 하나의 var 문을 사용하는 것이 좋습니다. 이것은 vars 옵션으로 거부 할 수 있습니다.


다음과 같이 한곳에서 변수를 선언하십시오.

var request,x,y;

함수 당 하나의 var 문만 허용되는 경우 "onevar"옵션이 true로 설정된 경우.

if (funct['(onevar)'] && option.onevar) {
    warning("Too many var statements.");
}

그 이유는 이미 설명되어 있습니다.

다음 양식을 사용하는 것이 좋습니다.

var myVar1 = document.getElementById("myDiv1"),
  myVar2 = document.getElementById("myDiv2");

아니면 이거:

var myVar1, myVar2;
myVar1 = document.getElementById("myDiv1");
myVar2 = document.getElementById("myDiv2");

그러나 이것은 특히 vars를 문서화하려는 경우별로 좋지 않습니다.

따라서이 경고를 일시적으로 비활성화 할 수 있습니다.

  /*jslint vars: true*/
  /**
   * @returns {HTMLDivElement}
   */
  var myVar1 = document.getElementById("myDiv1");
  /**
   * @returns {HTMLDivElement}
   */
  var myVar2 = document.getElementById("myDiv2");
  /*jslint vars: false*/

경고 :이 작업은 함수 상단에서 수행해야합니다.

jslint가 함수 상단에 vars가 선언되었는지 여부를 안정적으로 결정할 수 없기 때문에 이것이 수행되었다고 생각합니다.


여기서는 추측이지만 함수 분해 시간이 될 수 있습니다 . 함수는 가지를 수행하고 잘 수행해야합니다.

너무 많은 vars는 너무 많은 일을하려는 함수를 암시합니다. 또는 배열을 사용해야하는 경우.


The idea is that you should use an object instead of individual vars. So where you have got:

var x = arg + 1,
    y = cache.GetItem('xyz');

Change it to:

var dimensions = {};
dimensions.x = arg + 1;
dimensons.y = cache.GetItem('xyz');
dimensions.request = ...

You can then access these variables through the object, its neater to have one object per function to contain that functions variables. Then you won't get the warning.

참고URL : https://stackoverflow.com/questions/810313/what-is-the-reason-behind-jslint-saying-there-are-too-many-var-statements

반응형