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 相关文章推荐
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
javascipt:filter过滤介绍及使用
Sep 10 Javascript
Javascript模拟加速运动与减速运动代码分享
Dec 11 Javascript
jQuery数据缓存用法分析
Feb 20 Javascript
jQuery Validate表单验证入门学习
Dec 18 Javascript
Angular设置title信息解决SEO方面存在问题
Aug 19 Javascript
javascript设置文本框光标的方法实例小结
Nov 04 Javascript
小程序指纹验证的实现代码
Dec 04 Javascript
vue使用codemirror的两种用法
Aug 27 Javascript
electron 安装,调试,打包的具体使用
Nov 06 Javascript
nuxt配置通过指定IP和端口访问的实现
Jan 08 Javascript
详解Vue的列表渲染
Nov 20 Vue.js
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动态变静态原理
2006/11/25 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
php源码的安装方法和实例
2019/09/26 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
[04:39]显微镜下的DOTA2第十三期—Pis卡尔个人秀
2014/04/04 DOTA
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
使用python+whoosh实现全文检索
2019/12/09 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
实习自荐信
2013/10/13 职场文书
金秋助学感谢信
2015/01/21 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers