我抓住了这个代码形式的一些书,我碰到了互联网......
sm: new Ext.grid.RowSelectionModel({
singleSelect: true,
listeners: {
rowselect: {
fn: function(sm,index,record) {
Ext.Msg.alert('You Selected',record.data.title);
}
}
}
});
现在,sm
是选择模型的简写,我们在这里讨论一个ExtJS GridPanel ......在fn:
部分之前一切都很清楚。 AFAIK是一个匿名函数,传递了3个参数:sm,index和record。
现在我要投票,因为要求一些非常微不足道的事情:你怎么知道应该通过哪些参数?如果省略index参数,我将收到错误...为什么必须传递3个参数?有什么收获?
答案 0 :(得分:4)
考虑这种情况:
//called with (selectionModelInstance, Index, Record)
function myCallback(sm,index,record) {
//Parameter mapping:
//sm -> selectionModelInstance
//index -> Index
//record -> Record
alert(record.data);
//record is actually a record object, so record.data works
}
观察跳过参数时会发生什么:
//called with (selectionModelInstance, Index, Record)
function myCallback(sm,record) {
//Parameter mapping:
//sm -> selectionModelInstance
//record -> Index
alert(record.data); //Error
//record is actually Index here, and it obviosly doesn't have data property.
}
您在调用函数时看到的错误与参数不匹配无关。 Javascript允许使用任意数量的参数调用任意数量的参数。该错误与尝试取消引用不存在的属性record.data
有关。
要回答你的问题,你必须使用API指定的签名来定义回调函数,只是为了正确映射参数。
答案 1 :(得分:3)
参数不按名称传递;它们通过“位置”传递(就像大多数其他脚本和编程语言一样)。回调必须有三个参数,因为调用者将提供三个参数;如果不匹配,则会发生错误。