ExtJS监听器:匿名函数参数

时间:2010-08-03 23:27:22

标签: 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是选择模型的简写,我们在这里讨论一个ExtJS GridPanel ......在fn:部分之前一切都很清楚。 AFAIK是一个匿名函数,传递了3个参数:sm,index和record。

现在我要投票,因为要求一些非常微不足道的事情:你怎么知道应该通过哪些参数?如果省略index参数,我将收到错误...为什么必须传递3个参数?有什么收获?

2 个答案:

答案 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)

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