我如何将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
应该出现。 但是,匿名函数中的myMessage
variables为空。
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); };
它会工作,但我不知道这是否回答你的问题。