JS中使用变量保存arguments对象的方法

 更新时间:2016年06月03日 11:56:52   作者:脚后跟着猫  
这篇文章主要介绍了JS中使用变量保存arguments对象的方法的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下

迭代器(iterator)是一个可以顺序存取数据集合的对象。其一个典型的API是next方法。该方法获得序列中的下一个值。

迭代器示例

题目:希望编写一个便利的函数,它可以接收任意数量的参数,并为这些值建立一个迭代器。

测试代码好下:

var it=values(,,,,,,,,);
it.next();//
it.next();//
it.next();// 

分析:由于values函数需要接收任意多个参数,这里就需要用到上一节讲到的构建可变参数的函数的方法。然后里面的迭代器对象来遍历arguments对象的元素。

初步编码

function values(){
var i=,n=arguments.length;
return {
hasNext:function(){
return i<n;
},
next:function(){
if(this.hasNext()){
return arguments[i++];
}
throw new Error("已经到达最后啦");
}
}
}

用上面的测试代码进行测试

var it=values(,,,,,,,,);
it.next();//undefined
it.next();//undefined
it.next();//undefined 

错误分析

代码运行结果并不正确,下面就对初始的编码程序进行分析。

function values(){
var i=,n=arguments.length;//这里没有错误,arguments是values里的内置对象
return {
hasNext:function(){
return i<n;
},
next:function(){
if(this.hasNext()){
return arguments[i++];//错误出现在这里,arguments是next方法函数的内置对象。
}
throw new Error("已经到达最后啦");
}
}
} 

这里的指代错误,很像是另一个让人头痛的对象this。处理this的指向时,通常是使用变量和保存正确的this。然后在其它地方使用这个变量。那么arguments对象的解决方案就出来了,借助一个变量来存储,这样arguments对象的指代就没有问题了。

再次编码

function values(){
var i=,n=arguments.length,arg=arguments;
return {
hasNext:function(){
return i<n;
},
next:function(){
if(this.hasNext()){
return arg[i++];
}
throw new Error("已经到达最后啦");
}
}
} 

运行测试代码

var it=values(,,,,,,,,);
it.next();//
it.next();//
it.next();// 

结果和预期的相同。

提示

当引用arguments时当心函数嵌套层级

绑定一个明确作用域的引用到arguments变量,从而可以在嵌套的函数中引用它

附录一:迭代器

迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器上遍历的接口,设计人员无需关心容器的内容。

迭代器UML类图


迭代器js实现

对设计模式了解一点点,但具体项目中,有得多的也就是工厂模式,其它很少用,下面是一个简单的实现,不对的地方,欢迎交流。

代码如下

function List(){
this.data=[];
}
List.prototype={
add:function(){
var args=[].slice.call(arguments)
this.data=this.data.concat(args); 
},
remove:function(i){
this.data.splice(i,);
},
iterator:function(){
return new Iterator(this);
}
}
function Iterator(list){
this.list=list;
this.cur=;
};
Iterator.prototype={
hasNext:function(){
return this.cur<this.list.data.length-;
},
next:function(){
if(this.hasNext()){
return this.list.data[this.cur++];
}
throw new Error('已经到底了~');
},
remove:function(){
this.list.remove(this.cur);
}
}
var list=new List();
var it=list.iterator();
list.add(,,,,,,,,);
it.next();//
it.next();//
it.next();// 

以上所述是小编给大家介绍的JS中使用变量保存arguments对象的方法,希望对大家有所帮助!

相关文章

  • 详细聊聊TypeScript中unknown与any的区别

    详细聊聊TypeScript中unknown与any的区别

    unknown类型比较谦虚,就和他本身的意思一样,他从不祸害到其他的变量,但是any类型就是那种恶霸,属于什么都不管,谁也不敢管的类型,这篇文章主要给大家介绍了关于TypeScript中unknown与any区别的相关资料,需要的朋友可以参考下
    2021-10-10
  • javascript实现带节日和农历的日历特效

    javascript实现带节日和农历的日历特效

    这篇文章主要介绍了javascript实现带节日和农历的日历特效,效果十分棒,需要的朋友可以参考下
    2015-02-02
  • 详解javascript常用工具类的封装

    详解javascript常用工具类的封装

    本篇文章主要给大家详细分析了javascript常用工具类的封装相关知识点,有兴趣的朋友参考下吧。
    2018-01-01
  • 微信小程序实现蓝牙打印

    微信小程序实现蓝牙打印

    这篇文章主要为大家详细介绍了微信小程序实现蓝牙打印,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • javascript中活灵活现的Array对象详解

    javascript中活灵活现的Array对象详解

    本文的内容就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用。相信对大家学习或者理解javascript中的Array对象能具有一定的参考借鉴价值,有需要的朋友们下面跟着小编一起来学习学习吧。
    2016-11-11
  • 微信小程序实现购物车代码实例详解

    微信小程序实现购物车代码实例详解

    这篇文章主要介绍了微信小程序实现购物车代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 3种js实现string的substring方法

    3种js实现string的substring方法

    这篇文章主要介绍了3种javascript实现string的substring方法,需要的朋友可以参考下
    2015-11-11
  • javascript实现电脑和手机版样式切换

    javascript实现电脑和手机版样式切换

    这篇文章主要为大家详细介绍了javascript实现电脑和手机版样式切换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 全面解析JavaScript中的valueOf与toString方法(推荐)

    全面解析JavaScript中的valueOf与toString方法(推荐)

    本文给大家介绍JavaScript中的valueOf与toString方法,valueOf() 方法可返回 Boolean 对象的原始值,toString() 方法可把一个逻辑值转换为字符串,并返回结果。对js中valueof和tostring相关知识感兴趣的朋友一起学习吧
    2016-06-06
  • javascript移动设备Web开发中对touch事件的封装实例

    javascript移动设备Web开发中对touch事件的封装实例

    这篇文章主要介绍了javascript移动设备Web开发中对touch事件的封装实例,分别对tap事件、doubleTap事件、longTap事件、swipe事件做了封装,需要的朋友可以参考下
    2014-06-06

最新评论