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 指导方针
Apr 05 Javascript
判断浏览器的javascript版本的代码
Sep 03 Javascript
jquery调用asp.net 页面后台的实现代码
Apr 27 Javascript
javascript 数组排序函数sort和reverse使用介绍
Nov 21 Javascript
angularJS 中input示例分享
Feb 09 Javascript
ECMAScript6中Map/WeakMap详解
Jun 12 Javascript
jQuery表格插件datatables用法详解
Nov 23 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
Jun 08 Javascript
JS取模、取商及取整运算方法示例
Oct 13 Javascript
xcode中获取js文件的路径方法(推荐)
Nov 05 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
Dec 05 Javascript
如何手写一个简易的 Vuex
Oct 10 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通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
javascript中方便增删改cookie的一个类
2012/10/11 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python将图片批量从png格式转换至WebP格式
2020/08/22 Python
python对html过滤处理的方法
2018/10/21 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
python实现键盘输入的实操方法
2019/07/16 Python
python之拟合的实现
2019/07/19 Python
python生成随机红包的实例写法
2019/09/02 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
python批量处理txt文件的实例代码
2020/01/13 Python
Python中的流程控制详解
2021/02/18 Python
pandas map(),apply(),applymap()区别解析
2021/02/24 Python
用css3写出气球样式的示例代码
2017/09/11 HTML / CSS
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
医院护理人员的自我评价分享
2013/10/04 职场文书
打造完美自荐信
2014/01/24 职场文书
社区活动邀请函范文
2014/01/29 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL