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将数据导入Excel示例代码
Sep 10 Javascript
jquery使用hide方法隐藏指定id的元素
Mar 30 Javascript
JavaScript中的substr()方法使用详解
Jun 06 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
Aug 13 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
Jan 17 Javascript
jQuery实现级联下拉框实战(5)
Feb 08 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
May 11 Javascript
分析javascript中9 个常见错误阻碍你进步
Sep 18 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
Dec 07 Javascript
对vue 键盘回车事件的实例讲解
Aug 25 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
Sep 25 Javascript
angular学习之动态创建表单的方法
Dec 07 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 中文乱码解决办法总结分析
2009/07/30 PHP
解析coreseek for sphinx的使用
2013/06/21 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
Symfony2 session用法实例分析
2016/02/04 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
2015/11/01 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
vue中配置mint-ui报css错误问题的解决方法
2017/10/11 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
python中argparse模块用法实例详解
2015/06/03 Python
python pandas生成时间列表
2019/06/29 Python
python 两个数据库postgresql对比
2019/10/21 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
HTML5之HTML元素扩展(上)—新增加的元素及使用概述
2013/01/31 HTML / CSS
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
公司中秋节活动方案
2014/02/12 职场文书
大学新生军训感言
2014/02/25 职场文书
党员承诺书内容
2014/03/26 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
质量管理标语
2014/06/12 职场文书
企业法律事务工作总结
2015/08/11 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python