2010-11-22 7 views
12

여기 사용하는 것이 합리적입니다. 대체 방법은 무엇입니까? 나는 어떻게 그것들을 사용하는 것을 일반적으로 피할 수 있으며 무엇보다도 jsLint에 따라 전역을 사용하는 것이 좋지 않은 이유는 무엇입니까?왜 전역이 좋지 않습니까?

(function($){ 
    $(function(){ 
    $body = $('body'); //this is the BAD Global 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 

이해해 주시겠습니까? 그리고 나에게 더 나은 해결책을 주시겠습니까? 이 모두 덮어 쓰기 수 VAR없이

답변

18

전역 나쁜 그들이 바로 문제가 발생하지 않기 때문에. 나중에 그 코드를 처음부터 다시 쓰지 않고도 해결할 수없는 아주 추악한 문제가 발생할 것입니다.

예 : 일부 기능을 정의하려면 $body을 사용합니다. 그건 잘 작동합니다. 그러나 결국에는 가치가 필요합니다. 그래서 $body.foo을 사용합니다. 잘 작동합니다. 그런 다음 $body.bar을 추가하십시오. 그런 다음 몇 주 후 다른 값이 필요하므로 $body.bar을 추가하십시오.

코드를 테스트하면 효과가있는 것 같습니다. 그러나 사실 동일한 변수를 두 번 "추가"했습니다. JavaScript는 "새로운 변수를 한 번 만듭니다"라는 개념을 이해하지 못하기 때문에 문제가되지 않습니다. 이미 존재하지 않는 한 "생성"만 알면됩니다. 따라서 코드를 사용하면 결국 하나의 함수가 $body.bar 다른 함수를 수정합니다. 심지어 문제를 발견하면 많은 시간이 걸릴 것입니다.

그래서 변수가 필요한 경우에만 볼 수 있도록하는 것이 좋습니다. 이 방법은 한 함수가 다른 함수를 손상시킬 수 없습니다. 이것은 코드가 커짐에 따라 더 중요해진다.

2

당신이, 그때는 그 기능의 범위에서 지방 될 것이라고 var에 $의 몸을 정의해야

(function($){ 
    $(function(){ 
    var $body = $('body'); //this is the local variable 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 
+0

$ body – Mchl

+0

yes라는 ​​전역 변수를 덮어 씁니다. 그러나이 예제에서는 전역 값을 대체합니다.이 방법은 함수 범위 내에서만 숨 깁니다. – mpapis

+2

선언 된 로컬 변수를 사용하는 함수 리터럴 함수가 정의 된 것과 동일한 범위는 [closure] (http://jibbering.com/faq/notes/closures/)라고하며, jQuery에서 광범위하게 사용되어야합니다. – Phrogz

2

GLOBALE 변수는 다른 스크립트와 충돌 할 수 또는 덮어 쓰기 . 글로벌 광고가 필요하지 않은 경우이를 피하는 것이 좋습니다. 당신은

var $body = $('body'); 

으로합니다 (var 키워드의 사용)을 만들 것이라고 것을 다시 쓸 수

(function() { 
    var foo = 'bar'; 
    alert(foo); 
})(); 
2

: (당신의 JS-버전-지원이 큰 1.7보다 경우 또는 let) 간단히 var를 사용 당신의 목적에 맞는 로컬 변수. each 콜백의 범위 내에 있습니다.

전역 변수를 사용하는 것이 좋지 않은 이유는 다른 값으로 덮어 쓸 수 있기 때문입니다. 코드를 잘 확장하려면 사용하는 다른 스크립트에 따라 달라집니다. 가능하면 스크립트가 가능한 한 자급 자족 할 수 있도록하는 것이 바람직합니다. 가능한 한 의존성이 부족한 세계를 가리 킵니다.

0

jsLint는 매우 엄격합니다. 아마 그것에 대해 너무 매달릴 필요는 없습니다.

하지만 나쁜 생각한다면, 당신은 당신이 jQuery을 범위의 방법처럼 작업을 수행 할 수 있습니다

(function($){ 
    $(function(){ 
    $.each(somearray ,(function($body){ $body.dosomething() })($('body')); 

    if (something){ 
    $('body').somethingelse(); 
    } 

    }); 
}(jQuery)); 
+3

나는 jsLint가 말한 모든 것에 대해 모든 일을 처리 할 필요가 없다는 데 동의하지만이 상황에서는 언급하지 않을 것이다. 왜냐하면 나는 전역 적으로 고통스럽게 회피 될 수 있다면 그것들이 있어야한다는 것에 동의한다. 변수를 지역 변수로 선언 할 수 있으며 다른 작업은 필요하지 않습니다. –

+0

@David Hedlund : 동의 함 – kizzx2

관련 문제