浏览 3694 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-12-14
each: function(iterator, context) { var index = 0; iterator = iterator.bind(context); try { this._each(function(value) { iterator(value, index++); }); } catch (e) { if (e != $break) throw e; } return this; }, 我参考帮助,该方法接受2个参数[当前遍历的集合元素,元素在集合中的序号], 这句该怎么理解?iterator = iterator.bind(context);最后iterator返回的是什么?看不明白,请指点 还有他的all方法也有句: iterator = iterator ? iterator.bind(context) : Prototype.K; 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-12-14
iterator = iterator.bind(context)这句返回一个新的函数,这个函数和iterator唯一不同的地方就是内部的this上下文变成了参数context。这是1.6新增的功能,之前要实现同样的目的,你得这样:
enu.each(function(item,index){}.bind(context))
现在多了种选择:
enu.each(function(item,index){},context)
我喜欢后者,少敲代码哈哈
|
|
返回顶楼 | |
发表时间:2007-12-14
iterator = iterator ? iterator.bind(context) : Prototype.K;
这句嘛和上面一样,只是为了做到可选iterator参数而设计的。Prototype.K是个空函数,就是让你在调用each方法的时候可以省略实参,比如:
enu.each()
|
|
返回顶楼 | |
发表时间:2007-12-14
哦,就是这个意思吗?
[ 'hello', 'world'].each(function(s, index) {if(this == s)alert(index + ': ' + s);},'world'); 或则详细点写就这样 [ 'hello', 'world'].each( function(s, index) { if(this == s){alert(index + ': ' + s);} else{ alert("No Date!"); }}, 'world'); |
|
返回顶楼 | |
发表时间:2007-12-14
你这里用个string对象来做context,是有问题的,只所以会如你所想的打印出"1:world",那是因为String对"=="操作符的定义,你比较的是字符串的值而不是引用,当然就为真,但s和context是不同的两个字符串对象。
使用Prototype提供的这个特性,一般是为了在闭包(也就是第一个匿名函数)内部根据实际需要改变this值而已,所以传自定义对象,或者dom对象更有价值。
要想明白这个机制,就得对js的动态上下文有所了解,说简单点就是,在js里面,函数(或者方法)的内部上下文是“游离”的,可以随意绑定或修改,这与java对象的实例方法大不相同。
|
|
返回顶楼 | |
发表时间:2008-04-11
/**
* Enumerable的基础,each方法让你可以遍历所有元素并返回,从而实现连续调用<br> * 注:each的实现取决于每个实现类的具体方法 * @argument iterator 要执行的方法 * @argument context 上下文环境 * @return this 调用此方法的对象 */ each: function(iterator, context) { var index = 0; //iterator是自己要执行的方法 context上下文环境 //例 iterator = function(s,index) {document.wirte(index + ':' + s + '<br />');}; iterator = iterator.bind(context); try { //调用具体实现的_each方法,执行iterator方法 //例如,对于Array // _each: function(iterator) { // for (var i = 0, length = this.length; i < length; i++) // document.wirte(index++ + ':' + this[i] + '<br />'); // } this._each(function(value) { iterator(value, index++); }); } catch (e) { if (e != $break) throw e; } //返回调用此方法的对象 return this; } |
|
返回顶楼 | |