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 操作文件 实现方法小结
Jul 02 Javascript
单击某一段文字改写文本颜色
Jun 06 Javascript
js图片卷帘门导航菜单特效代码分享
Sep 10 Javascript
浅析JS运动
Dec 28 Javascript
浅谈jQuery中事情的动态绑定
Feb 12 Javascript
js 两数组去除重复数值的实例
Dec 06 Javascript
webpack中的热刷新与热加载的区别
Apr 09 Javascript
vue.js与后台数据交互的实例讲解
Aug 08 Javascript
Vue源码分析之Vue实例初始化详解
Aug 25 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
Sep 06 Javascript
ES11新增的这9个新特性,你都掌握了吗
Oct 15 Javascript
用vite搭建vue3应用的实现方法
Feb 22 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
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
重载toString实现JS HashMap分析
2011/03/13 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
详解微信小程序 页面跳转 传递参数
2016/12/08 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
python list语法学习(带例子)
2013/11/01 Python
python写的一个squid访问日志分析的小程序
2014/09/17 Python
linux环境下python中MySQLdb模块的安装方法
2017/06/16 Python
python中logging库的使用总结
2017/10/18 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
Pycharm更换python解释器的方法
2018/10/29 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
django 消息框架 message使用详解
2019/07/22 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
编写strcpy函数
2014/06/24 面试题
施工资料员岗位职责
2014/01/06 职场文书
小学班主任评语大全
2014/04/23 职场文书
销售个人求职信范文
2014/04/28 职场文书
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers