论坛首页 Web前端技术论坛

prototype库1.6版中的Enumerable的each方法?

浏览 3694 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-14  
source code:
  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;
   发表时间: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) 我喜欢后者,少敲代码哈哈
0 请登录后投票
   发表时间:2007-12-14  
iterator = iterator ? iterator.bind(context) : Prototype.K; 这句嘛和上面一样,只是为了做到可选iterator参数而设计的。Prototype.K是个空函数,就是让你在调用each方法的时候可以省略实参,比如: enu.each()
0 请登录后投票
   发表时间: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');
0 请登录后投票
   发表时间:2007-12-14  
你这里用个string对象来做context,是有问题的,只所以会如你所想的打印出"1:world",那是因为String对"=="操作符的定义,你比较的是字符串的值而不是引用,当然就为真,但s和context是不同的两个字符串对象。 使用Prototype提供的这个特性,一般是为了在闭包(也就是第一个匿名函数)内部根据实际需要改变this值而已,所以传自定义对象,或者dom对象更有价值。 要想明白这个机制,就得对js的动态上下文有所了解,说简单点就是,在js里面,函数(或者方法)的内部上下文是“游离”的,可以随意绑定或修改,这与java对象的实例方法大不相同。
0 请登录后投票
   发表时间: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;
  }
0 请登录后投票
论坛首页 Web前端技术版

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