我有一位同事问我他为什么无法从回调函数中访问事件参数。事实证明,在调用完成后,jquery似乎将事件设置为null,并创建了一个临时局部变量来修复问题(见下文)。
然后这让我思考,为什么“消息”甚至可用于回调。有人可以解释一下吗?
$('some seletor').click({msg: message},function(event){
alert(event.data.msg); //event.data.msg is not available to the json callback because event is null
var message = event.data.msg; //message will be available to the callback...why?
$.getJSON('ajax/test.json', function(data) {
alert(message); //works ok - why is the message variable visible here at all, should it not have gone out of scope when the above function ended?
alert(event.data.msg); //will crash, seems that event has been set to null by the framework after the function finished
});
});
答案 0 :(得分:4)
给定范围内存在的任何变量都可用于该范围内定义的所有函数。 (这就是如何定义作用域在JS中的作用,this part of the language specification可能是一个很好的切入点,如果你想要它的定义的细节那么多。
由于定义回调的函数表达式位于定义变量的函数内,因此该变量可用。
答案 1 :(得分:3)
试试这个:
$('some seletor').click({msg: message},function(ev){
alert(ev.data.msg);
var message = ev.data.msg;
$.getJSON('ajax/test.json', function(data) {
alert(message);
alert(ev.data.msg);
});
});
而不是event
。因为事件是全局对象window.event
,并且在事件结束时变为未定义。您可以使用事件对象而不从以下参数中获取它:
$('some seletor').click({msg: message},function(){
alert(event.data.msg);
});
答案 2 :(得分:0)
如果您原谅伪代码 - 尝试将其视为嵌套块 - 这种事情
function foo()
{
int bar=0;
//inner block
{
bar++;
}
}
或更具体地说
function click()
{
variable {msg: message}
//inner block
function(ev)
{
....
}
}