2010-07-03 9 views
0

일부 버튼에 이벤트 핸들러를 추가하려는 코드가 있습니다. 글로벌 변수 &을 콜백 클로저 &에 저장하지 않고 현재 값을 저장하고 싶습니다.자바 스크립트의 클로저

var globalNum="dummy"; 
function A() 
{ 
    $("#button").click(function() 
    { 
    $("#button").append(globalNum); 
    }); 
} 

globalNum="dummyAgain"; 

클릭 이벤트가 발생하면 "dummy"또는 "dummyAgain"이 추가됩니다. 나는 closure 전역 변수의 참조가 저장되는 "dummyAgain"coz라고 믿는다. 나는 가치를 묶고 싶다. 전역 변수 &으로 초기화 할 수있는 A 내부의 로컬 변수를 만들 수 있다는 것을 알고 있습니다.하지만 다른 주변의 더 쿨한 방법이 있습니까?

감사

답변

7

자네 말이 맞아, 그것은 dummyAgain를 추가합니다. 당신은 bind()를 사용하여이 다루는 일부 이벤트 데이터를 보낼 수 있습니다 클릭 핸들러가 전에 globalNum 변경의 값을 을 부착됩니다, 그래서 나는 즉시 기능 A을 실행

var globalNum="dummy"; 
(function A() 
{ 
    $("#button").bind('click', {localNum: globalNum}, function(e) 
    { 
    $("#button").append(e.data.localNum); 
    }); 
})(); 

globalNum="dummyAgain"; 

참고. @Andrew가 그의 의견에서 지적했듯이, 이것은 "wrapping"함수 A을 사용하지 않는 것과 같은 효과입니다. bind없이


동일한 솔루션 : 익명 함수는 로컬 변수의 현재 값을 포착 globalNum 유용 여기

(function() 
{ 
    var localNum = globalNum; 
    $("#button").click(function() 
    { 
    $("#button").append(localNum); 
    }); 
})(); 

.


업데이트 : 완성도를 위해서 (내가 앤드류, 당신은 내가 여기에 그것을 넣어 상관 없어, 희망)에 대한

. 은 "멋진"방법은이 매개 변수를 사용하여 즉시 기능을 함수에 대한 매개 변수를 사용하여 실행 아마도 :

var globalNum="dummy"; 

(function(globalNum) 
{ 
    $("#button").click(function() 
    { 
    $("#button").append(globalNum); 
    }); 
})(globalNum); 

globalNum="dummyAgain"; 

은 "트릭은"매개 변수의 이름과 전역 변수의 이름을 있다는 것입니다 같은.

이것은 또한 전역 네임 스페이스를 오염시키지 않으면 서 더 짧은 식별자를 가진 일부 개체를 참조하는 데 자주 사용됩니다. jQuery를 함께 :

(function($) { 
    // jQuery == $ 
})(jQuery) 
+1

+1 답. @Felix_Kling은'bind()'를 사용하고 있지만'globalNum'을 업데이트하기 전에'A()'를 호출한다고 지적해야합니다. 이것은'A()'함수 래퍼를 제거하고 내용을 직접 실행하는 것과 동등합니다. – Andrew

+0

감사. 하지만 적어도 로컬 데이터를 명시 적으로 생성하고 싶지는 않습니다. 그 외에는 단순히 A의 본문에 localNum = globalNum을 정의하고 콜백 함수를 닫으면 localNum을 추가 할 수 있습니다. 로컬 데이터를 만드는 데 약간의 문제가있는 것은 아닙니다. 나는 더 시원한 것을 찾고 있습니다. :) –

+3

그런 다음 @Felix Kling의 대답을 사소한 변경으로 사용하십시오.'function A()'를'function A (globalParam)'로 변경하고 끝에}}) (globalParam);을 호출하십시오. 함수 내부의'globalParam'은 밖에있는'globalParam'과 다를 것입니다. – Andrew

0

은 어쩌면 약간의 냉각기 방법이 있지만, 내부의 지역 변수를 선언하는 것은 따라서, 최고의 가장 간단하고 직접적인 방법입니다.