Javascript ExtJS侦听器:匿名函数参数

Javascript ExtJS侦听器:匿名函数参数,javascript,extjs,listener,anonymous-function,Javascript,Extjs,Listener,Anonymous Function,我从我在互联网上偶然发现的某本书上抓到了这段代码 sm: new Ext.grid.RowSelectionModel({ singleSelect: true, listeners: { rowselect: { fn: function(sm,index,record) { Ext.Msg.alert('You Selected',record.data.title); } }

我从我在互联网上偶然发现的某本书上抓到了这段代码

sm: new Ext.grid.RowSelectionModel({
   singleSelect: true,
   listeners: {
       rowselect: {
           fn: function(sm,index,record) {
               Ext.Msg.alert('You Selected',record.data.title);
           }
       }
   }
});
现在,
sm
是选择模型的简写,我们在这里讨论一个ExtJS网格面板。。。一切都很清楚,直到
fn:
部分。首先,传递一个匿名函数,其中包含3个参数:sm、index和record


现在,我要为一个极其琐碎的问题获得选票:如何知道应该通过哪些参数?如果我省略索引参数,我将得到一个错误。。。为什么我必须传递3个参数?问题是什么?

参数不是按名称传递的;它们通过“位置”传递(与大多数其他脚本和编程语言一样)。回调必须有三个参数,因为调用方将提供三个参数;如果不匹配,则会发生错误。

考虑以下情况:

//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指定的签名定义回调函数,这仅仅是为了正确映射参数。

我知道这里正在使用位置匹配。。。我不明白的是为什么我必须传递3个参数:一个用于选择模型,第二个用于索引,第三个用于网格中的数据值?对不起,RTFM问题。。。来自官方文档的chunk:
rowselect:(SelectionModel this,Number rowIndex,Ext.data.Record r)
因此,rtard最终得到了它:它是一个特定于事件的函数!不,这不是原因。您必须在函数中接受三个参数的原因是extJS希望您接受它们。请参阅@IgorZevaka的答案,以获得更全面的解释。是的。。。这是一个特定于事件的函数,您必须以精确的顺序传递3个参数,否则它将抛出错误!在这种情况下,函数与rowSelect公共事件“链接”。谢谢为了澄清前面的评论,如果实际使用第三个参数,则必须只传递所有3个参数。它不会因为您省略了参数而抛出错误——当您尝试访问空引用时,它会抛出错误。您只需指定实际要在函数中使用的最后一个参数即可,之后的所有其他参数都可以省略。这通常适用于函数,而不仅仅是事件处理程序。