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 相关文章推荐
[原创]保存的js无法执行的解决办法
Feb 25 Javascript
JavaScript this 深入理解
Jul 30 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
Jan 22 Javascript
javascript中的prototype属性使用说明(函数功能扩展)
Aug 16 Javascript
js中巧用cssText属性批量操作样式
Mar 13 Javascript
Prototype的Class.create函数解析
Sep 22 Javascript
Jquery图形报表插件 jqplot简介及参数详解
Oct 10 Javascript
jQuery实现径向动画菜单效果
Jul 17 Javascript
JavaScript 经典实例日常收集整理(常用经典)
Mar 30 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
Dec 31 Javascript
详解开源的JavaScript插件化框架MinimaJS
Oct 26 Javascript
vue实现点击追加选中样式效果
Nov 01 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
《魔兽世界》惊魂幻象将获得调整
2020/03/08 其他游戏
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
Linux编译升级php的详细方法
2013/11/04 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
php中判断数组相等的方法以及数组运算符介绍
2015/03/30 PHP
帝国cms常用标签汇总
2015/07/06 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
javascript 写类方式之四
2009/07/05 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
Python读写Redis数据库操作示例
2014/03/18 Python
python实现跨文件全局变量的方法
2014/07/07 Python
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
十条建议帮你提高Python编程效率
2016/02/16 Python
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
化验室技术员岗位职责
2013/12/24 职场文书
银行职员思想汇报
2013/12/31 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
数学教师个人工作总结
2015/02/06 职场文书
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL