论坛首页 Web前端技术论坛

对bindAsEventListener源码的一点不理解

浏览 6219 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-08  
Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
  }
}


我不理解args已经是arguments数组了,为什么在返回时要用两个.concat(args).concat($A(arguments)),这不就是复制两次相同的内容吗,不理解
   发表时间:2007-06-08  
两个argument不一样的 这是函数里面的函数 有2个argument
0 请登录后投票
   发表时间:2007-06-08  
我的理解是 args = $A(arguments),这是我调bindAsEventListener这个方法他的arguments,在调用apply时最后的那个concat是我调bindAsEventListener的那个function他的参数.是这样理解吧
0 请登录后投票
   发表时间:2007-06-08  
注意arguments的scope。

假设有function f1
f2 = f1.bindAsEventListener(elem, a, b)

所返回的f2如果调用f2(x, y),实际上等于:

elem.f = f1
elem.f(event, a, b, x, y)
0 请登录后投票
   发表时间:2007-06-08  
谢谢,举的例子,使我更加的理解了
0 请登录后投票
   发表时间:2007-06-09  
对function的原型进行扩展(bindAsEventListener),是因为在绑定dom对象的事件,可以绑定自己定义的function的上下文Context对象,如:
 function MyContext(){....}
 MyContext.prototype.doMethod=function(){};
 var context=new MyContext();
 $("dom ID").onclick=function(event){
   this.doMethod();//注意:这里的this如果没有调用bindAsEventListener的话是dom对象,但是现在绑定的是MyContext的实例
  }.bindAsEventListener(context);
0 请登录后投票
   发表时间:2007-08-30  
1.5.1的代码:

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [event || window.event].concat(args));
  }
}
为什么和前面的版本不一样啊??
0 请登录后投票
   发表时间:2007-08-31  
我觉得.concat($A(arguments))在原来的方法里就是多于的,他是把return 的那个匿名函数的参数在
追加上,可参数只有event,一个,但在最前面 [event || window.event]已经有了

0 请登录后投票
   发表时间:2007-09-02  
仍外 arguments不是数组!
0 请登录后投票
   发表时间:2007-09-02  
arguments不是数组是es3的错误,es4会改正。此外有少数引擎上arguments是数组(具体哪个忘记了。。。),另外许多引擎上可以对arguments使用Array上的方法,但是不是所有的方法,会有差异。但通常slice方法都可以奏效,所以许多类库用slice来把arguments转化为数组对象。

To justlooks:

为什么1.5.1不一样?这个要去问prototype的维护者。我个人看下来是这个原因:

本身IE在attachEvent的时候,其实是有像Moz等一样传入event对象的(但是直接的onclick属性上赋值是没有的),因此在IE下,原先prototype版本实际上会获得两个参数,第一个是window.event,第二个还是window.event (准确的说,不是window.event,而是另一个对象,但所有的属性与window.event是一样的,估计跟window.event一样,是同样的native对象的不同包装对象)

但是(我又说但是了。。。),并非所有事件传入的都是event对象,我印象当中onbeforeunload就可能有所不同,具体需要测试一下。总之IE里面时不时你会发现一些很诡异的东西。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics