浏览 6220 次
精华帖 (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)),这不就是复制两次相同的内容吗,不理解 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-06-08
两个argument不一样的 这是函数里面的函数 有2个argument
|
|
返回顶楼 | |
发表时间:2007-06-08
我的理解是 args = $A(arguments),这是我调bindAsEventListener这个方法他的arguments,在调用apply时最后的那个concat是我调bindAsEventListener的那个function他的参数.是这样理解吧
|
|
返回顶楼 | |
发表时间: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) |
|
返回顶楼 | |
发表时间:2007-06-08
谢谢,举的例子,使我更加的理解了
|
|
返回顶楼 | |
发表时间: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); |
|
返回顶楼 | |
发表时间: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)); } } 为什么和前面的版本不一样啊?? |
|
返回顶楼 | |
发表时间:2007-08-31
我觉得.concat($A(arguments))在原来的方法里就是多于的,他是把return 的那个匿名函数的参数在
追加上,可参数只有event,一个,但在最前面 [event || window.event]已经有了 |
|
返回顶楼 | |
发表时间:2007-09-02
仍外 arguments不是数组!
|
|
返回顶楼 | |
发表时间: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里面时不时你会发现一些很诡异的东西。 |
|
返回顶楼 | |