2017-02-16 7 views
3

같은 코드가 양면으로 쓰여졌는데, 둘 사이에 트레이드 오프가 있는지 궁금해합니다.전역 변수를 함수에 전달하는 이유는 무엇입니까?

방법 1 :

(function(i) { 
    // Do something to i now 
}(global_variable)) 

방법 2 :

(function() { 
    // Do something to global_variable now 
}()) 
어쨌든 그 범위에 존재하는거야 경우 함수에 전역 변수를 전달할 것입니다 왜

?

+2

첫 번째 코드 블록은 함수 내에서'global_variable'이 아닌'i'를 사용해야합니다. – Barmar

+0

변수를 참조하면 성능이 향상 될 수 있습니다. JavaScript에서는 범위가 더 가까울수록 변수가 더 빨리 사용됩니다. – David

+1

충돌을 피하십시오. 나중에 뭔가가'global_variable'에 저장된 참조를 대체한다면, iife 내부의 코드는 상관하지 않을 것입니다. –

답변

3

이 경우이 함수는 전역을 사용하고 쉽게 별칭을 입력한다는 명확한 지침을 제공합니다. 또한 전역 범위에서 변수를 찾을 때까지 모든 범위를 검색 할 필요가 없으므로 변수를 조금 더 빠르게 액세스 할 수 있습니다.

정규 함수의 경우, 예제와 같이 일상적인 함수가 아닌 경우 전역 함수를보다 쉽게 ​​전달할 수 있으므로 함수를 테스트 할 수 있습니다. 예를 들어 목적을 앨리어싱에 대한

+0

@rasmeister 지금 우리가 해트 한 의견을 삭제하십시오. –

1

:

(function(leeloo){ 

    //inside here you can use the short term 

})(LeeloominaiLekataribaLaminaTchaiEkbatDeSebat) 

//this would be similar, it's a matter of preference 
(function(){ 
    var leeloo = LeeloominaiLekataribaLaminaTchaiEkbatDeSebat; 

    //... 
})() 

또는이 예와 같이 값을 둘러싸 :

(function($){ 

    //in here, $ preserves the passed/injected value, 
    //even if the global value changes 

})(jQuery.noConflict()) 

당신도 같은 페이지에 jQuery를 여러 버전을 사용할 수있는이 방법.

+1

두 번째 경우에는 iife에서 비동기식 작업을 수행하는 경우에만이 작업을 수행하는 것이 유익합니다. 그렇지 않으면 보존 할 이유가 없습니다. 하지만, 어쨌든 jquery의 경우는 거의 항상 그렇습니다. –

+0

@KevinB'iife 내에서 비동기식 기능을 수행합니다. ... jquery의 주요 사용 사례 중 하나 인 사용자 상호 작용을 포함하는 것 같습니다. 예, jquery가 이것에 대한 가장 좋은 예는 아니지만 많은 것들을 만들지 않고 내 마음에 오는 최고 * (일반적인 체재) *.글로벌 변수에 어떤 영향을 미치는지에 관계없이 전달 된 값을 캡슐화하고 보존하기 위해 폐쇄로 iife를 사용하는 것입니다. – Thomas

+0

정확히. jquery를 사용하면 바인딩 이벤트가 가장 좋기 때문에 비동기 작업을 수행 할 수 있습니다. 사용하기 좋은 예제이다. (비록 $ (function ($) {...})를 사용해서도 가능하다.) –

1

어떤 이유로 든 global_variable의 값을 영구적으로 변경하지 않으려는 경우 첫 번째 예제를 사용할 수 있습니다. 예 : 이 코드를 실행하면 로컬 복사본이 변경되지만 전역 변수는 변경되지 않습니다.

global_variable=true; (function(i){ i=false; return i; }(global_variable)); 

그러나이 코드는 분명히 global_variable 변경 :

global_variable=true; (function(){ global_variable=false; }()); 

편집 : 그것은 전역 변수를 변경 좋아하지만, 함수를 호출하면 섀도 복사본을 생성하지 않기 때문에 다소 접선 방향이 변화가 보인다 전역 변수의 이 패턴은 혼동을 일으킬 수 있으므로 피해야합니다 :

g=true; (function(g){ g=false; return g; }(g));