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


Posted in Javascript onJune 03, 2016

迭代器(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中使用变量保存arguments对象的方法

迭代器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对象的方法,希望对大家有所帮助!

Javascript 相关文章推荐
动态加载iframe
Jun 16 Javascript
判断是否输入完毕再激活提交按钮
Jun 26 Javascript
JavaScript Undefined,Null类型和NaN值区别
Oct 22 Javascript
jQuery Ajax 全解析
Feb 08 Javascript
浅谈JavaScript事件的属性列表
Mar 01 Javascript
D3.js中data(), enter() 和 exit()的问题详解
Aug 17 Javascript
jquery 中toggle的2种用法详解(推荐)
Sep 02 Javascript
javascript 产生随机数的几种方法总结
Sep 26 Javascript
微信小程序中实现手指缩放图片的示例代码
Mar 13 Javascript
vue+webpack实现异步加载三种用法示例详解
Apr 24 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
Jul 31 Javascript
vue项目实现减少app.js和vender.js的体积操作
Nov 12 Javascript
jQuery+ajax简单实现文件上传的方法
Jun 03 #Javascript
JS使用eval()动态创建变量的方法
Jun 03 #Javascript
jQuery插件编写步骤详解
Jun 03 #Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
Jun 03 #Javascript
JSON字符串转换JSONObject和JSONArray的方法
Jun 03 #Javascript
JS判断字符串变量是否含有某个字串的实现方法
Jun 03 #Javascript
JavaScript闭包实例详解
Jun 03 #Javascript
You might like
php 文件上传实例代码
2012/04/19 PHP
PHP实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
vue项目中使用百度地图的方法
2018/06/08 Javascript
python获得图片base64编码示例
2014/01/16 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
python中的变量如何开辟内存
2018/06/26 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
Django多个app urls配置代码实例
2020/11/26 Python
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
泰国在线书店:SE-ED
2020/06/21 全球购物
研发工程师的岗位职责
2013/11/18 职场文书
《母鸡》教学反思
2014/02/25 职场文书
绿化工程实施方案
2014/03/17 职场文书
工地质量标语
2014/06/12 职场文书
法定代表人授权委托书范文
2014/08/02 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
死亡赔偿协议书
2015/01/28 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
病房管理制度范本
2015/08/06 职场文书
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python