IT TIP

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

itqueen 2020. 10. 26. 21:37
반응형

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


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는 많은 익명 함수를 사용하는데, 그 인수를 전달하는 가장 좋은 방법은 무엇입니까?


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

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

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

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


이벤트를 함수에 바인딩하기 때문에 수행 한 작업이 작동하지 않습니다. 따라서 이벤트가 발생할 때 호출 될 매개 변수를 정의하는 이벤트입니다 (즉, 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>

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

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

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

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

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


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

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

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

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


<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) 와 함께 데이터 전달할 수 있습니다 .


Example:

<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>

The delegates:

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

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

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

Running the displayMessage function:

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

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

What you have done is created a new anonymous function that takes a single parameter which then gets assigned to the local variable myMessage inside the function. Since no arguments are actually passed, and arguments which aren't passed a value become null, your function just does alert(null).


If you write it like

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

It will work, but I don't know if that answers your questions.

참고URL : https://stackoverflow.com/questions/224820/how-can-i-pass-arguments-to-anonymous-functions-in-javascript

반응형