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.
'UFO ET IT' 카테고리의 다른 글
액세스 토큰없이 Facebook Graph API를 사용하여 공개 페이지 상태 가져 오기 (0) | 2020.11.24 |
---|---|
(…()) vs. (…)() in javascript closures (0) | 2020.11.24 |
다중 처리 오류와의 또 다른 혼동, '모듈'개체에 'f'속성이 없습니다. (0) | 2020.11.23 |
인덱스 키 열 VS 인덱스 포함 열 (0) | 2020.11.23 |
Mockito : 일반 매개 변수로 확인 (0) | 2020.11.23 |