JavaScript에서 익명 함수에 인수를 어떻게 전달할 수 있습니까?


83

JavaScript에서 익명 함수에 인수를 전달하는 방법을 알아 내려고합니다.

이 샘플 코드를 확인하면 내가 의미하는 바를 알 수있을 것입니다.

<input type="button" value="Click me" id="myButton" />

<script type="text/javascript">
    var myButton = document.getElementById("myButton");
    var myMessage = "it's working";
    myButton.onclick = function(myMessage) { alert(myMessage); };
</script>

버튼을 클릭하면 다음 메시지 it's working가 나타납니다. 그러나 myMessage익명 함수 내부 의 변수는 null입니다.

jQuery는 많은 익명 함수를 사용하는데, 그 인수를 전달하는 가장 좋은 방법은 무엇입니까?


답변:


72

특정 케이스가 작동하도록 간단히 수정할 수 있습니다.

<script type="text/javascript">
  var myButton = document.getElementById("myButton");
  var myMessage = "it's working";
  myButton.onclick = function() { alert(myMessage); };
</script>

이 예제는 생성되고 요소에 대한 핸들러로 할당 된 익명 함수가 생성 된 컨텍스트에 정의 된 변수에 액세스 할 수 있기 때문에 작동합니다.

레코드의 경우 핸들러 (onxxx 속성 설정을 통해 할당)는 단일 인수가 DOM에 의해 전달되는 이벤트 개체를 취할 것으로 예상하며 다른 인수를 강제로 전달할 수 없습니다.


27

이벤트를 함수에 바인딩하기 때문에 수행 한 작업이 작동하지 않습니다. 따라서 이벤트가 발생할 때 호출 될 매개 변수를 정의하는 이벤트입니다 (즉, JavaScript는 onclick에 바인딩 한 함수의 매개 변수에 대해 알지 못하므로 아무것도 전달할 수 없습니다).

그러나 이렇게 할 수 있습니다.

<input type="button" value="Click me" id="myButton"/>

<script type="text/javascript">

    var myButton = document.getElementById("myButton");

    var myMessage = "it's working";

    var myDelegate = function(message) {
        alert(message);
    }

    myButton.onclick = function() { 
        myDelegate(myMessage);
    };

</script>

반환 값을 myDelegate에 할당하는 람다가 메시지를 어떻게 이해하는지 알 수 없습니다. function (a, b) {// code here} (a, b); 같은 람다를 보았습니다.
다니엘 N.

21

다음은 귀하가 언급 한 문제를 해결하기 위해 클로저를 사용하는 방법입니다. 또한 바인딩에 영향을주지 않고 시간이 지남에 따라 메시지를 변경할 수 있다는 사실도 고려합니다. 그리고 그것은 간결하게 jQuery를 사용합니다.

var msg = (function(message){
  var _message = message;
  return {
    say:function(){alert(_message)},
    change:function(message){_message = message}
  };
})("My Message");
$("#myButton").click(msg.say);

나는 배우고있다. 왜 할당 _message합니까? 왜 그냥 사용하지 message않습니까?
Jonathan M

이 경우 변경 메서드의 내부 범위가 유효한 서명을 가질 수 있도록 수행합니다. 그렇지 않으면 외부 클로저에서 메시지 값을 변경할 방법이 없습니다.
Gabriel

클로저를 사용한 훌륭한 대답. 그러나 "메시지"가 오해의 소지가 있기 때문에 "변경"함수 인수의 이름을 바꾸겠습니다. 외부 "메시지"인수와 관련이 없다는 것이 더 명확해야합니다. 해당 함수는 다음과 같이 리팩터링 될 수 있습니다. change : function (newmessage) {_ message = newmessage}
Matteo-SoftNet

8

익명 함수에서 매개 변수를 제거하면 본문에서 사용할 수 있습니다.

    myButton.onclick = function() { alert(myMessage); };

자세한 정보는 '자바 스크립트 클로저'를 검색하십시오.


말씀하신대로 "JavaScript 클로저"에 대해 읽어야합니다. 감사합니다!
hakksor

6

이벤트 핸들러는 발생한 이벤트 인 하나의 매개 변수를 예상합니다. 이름을 'myMessage'로 변경하므로 메시지가 아닌 이벤트 객체에 경고합니다.

클로저를 사용하면 함수 외부에서 정의한 변수를 참조 할 수 있지만 Jquery를 사용하는 경우 이벤트 특정 API를 살펴볼 수 있습니다.

http://docs.jquery.com/Events/bind#typedatafn

여기에는 자신의 데이터를 전달하는 옵션이 있습니다.


3
<input type="button" value="Click me" id="myButton" />

<script type="text/javascript">
    var myButton = document.getElementById("myButton");

    myButton.myMessage = "it's working";

    myButton.onclick = function() { alert(this.myMessage); };


</script>

이것은 IE6 +의 모든 것을 포함하는 내 테스트 스위트에서 작동합니다. 익명 함수는 자신이 속한 객체를 인식하므로 이를 호출하는 객체 (이 경우 myButton) 와 함께 데이터 전달할 수 있습니다 .


1

예:

<input type="button" value="Click me" id="myButton">
<script>
    var myButton = document.getElementById("myButton");
    var test = "zipzambam";
    myButton.onclick = function(eventObject) {
        if (!eventObject) {
            eventObject = window.event;
        }
        if (!eventObject.target) {
            eventObject.target = eventObject.srcElement;
        }
        alert(eventObject.target);
        alert(test);
    };
    (function(myMessage) {
        alert(myMessage);
    })("Hello");
</script>

한 가지 변경 : eventObject = eventObject || window.event; 한 가지 더 변경 : eventObject = eventObject || window.event || {};
눈꺼풀 없음

또 다른 변경 : eventObject.target = eventObject.target || eventObject.srcElement || 없는;
눈꺼풀 없음

1

대표자 :

function displayMessage(message, f)
{
    f(message); // execute function "f" with variable "message"
}

function alerter(message)
{
    alert(message);
}

function writer(message)
{
    document.write(message);
}

displayMessage 함수 실행 :

function runDelegate()
{
    displayMessage("Hello World!", alerter); // alert message

    displayMessage("Hello World!", writer); // write message to DOM
}

0

당신이 한 것은 단일 매개 변수를 취하는 새로운 익명 함수를 생성 한 다음 함수 내부의 지역 변수 myMessage에 할당되는 것입니다. 실제로 전달되는 인수가없고 값이 전달되지 않은 인수가 null이되므로 함수는 alert (null) 만 수행합니다.


0

당신이 그것을 쓰면

myButton.onclick = function() { alert(myMessage); };

작동하지만 질문에 대한 답변인지 모르겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.