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 相关文章推荐
用javascript实现计算两个日期的间隔天数
Aug 14 Javascript
使用JS 清空File控件的路径值
Jul 08 Javascript
javascript自启动函数的问题探讨
Oct 05 Javascript
JavaScript数字和字符串转换示例
Mar 26 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 Javascript
AngularJS基础 ng-cloak 指令简单示例
Aug 01 Javascript
JS 获取HTML标签内的子节点的方法
Sep 21 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
Jan 09 Javascript
微信小程序 下拉列表的实现实例代码
Mar 08 Javascript
微信小程序中使用echarts的实现方法
Apr 24 Javascript
关于layui的动态图标不显示的解决方法
Sep 04 Javascript
JS前端使用Canvas快速实现手势解锁特效
Sep 23 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+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
2015/05/14 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
[41:21]夜魇凡尔赛茶话会 第三期02:看图识人
2021/03/11 DOTA
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
Python变量赋值的秘密分享
2018/04/03 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
详解Python中namedtuple的使用
2020/04/27 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
中学生爱国演讲稿
2013/12/31 职场文书
仓库组长岗位职责
2014/01/29 职场文书
运动会开幕式主持词
2014/03/28 职场文书
大学生求职信例文
2014/06/29 职场文书
新员工入职感言范文!
2019/07/04 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL