我如何将parameter passing给JavaScript中的匿名函数?

我想弄清楚如何将parameter passing给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> 

当点击button的消息: it's working应该出现。 但是,匿名函数中的myMessagevariables为空。

jQuery使用了很多匿名函数,传递这个参数的最好方法是什么?

您的具体情况可以简单地纠正为工作:

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

这个例子是可行的,因为创build匿名函数并将其作为元素的处理程序进行分配将有权访问在创build它的上下文中定义的variables。

为了logging,一个处理程序(通过设置onxxx属性来指定)需要单个参数来接受由DOM传递的事件对象,并且不能强制在那里传递其他参数

你所做的事不起作用,因为你将一个事件绑定到一个函数。 因此,事件定义了事件引发时会调用的参数(即JavaScript不知道你绑定的函数中的参数,因此不能传入任何东西)。

你可以这样做:

 <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); }; 

欲了解更多信息search“JavaScriptclosures”

事件处理程序期望一个参数是被触发的事件。 您恰好将其重命名为“myMessage”,因此您正在提醒事件对象而不是您的消息。

闭包可以让你引用你在函数外部定义的variables,但是如果你正在使用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> 

这在我的testing套件中有效,它包含了IE6 +的一切。 匿名函数知道它所属的对象,因此你可以调用它的对象(在本例中为myButton)传递数据。

例:

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

代表:

 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 } 

你所做的是创build一个新的匿名函数,它接受一个单独的参数,然后在函数内部分配给本地variablesmyMessage。 由于没有实际的parameter passing,没有传递值的参数变为空,你的函数只是alert(null)。

如果你这样写

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

它会工作,但我不知道这是否回答你的问题。