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 isType() 类型判断代码
Feb 14 Javascript
$.ajax返回的JSON无法执行success的解决方法
Sep 09 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
May 13 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
Jan 13 Javascript
JavaScript实现动态添加,删除行的方法实例详解
Jul 02 Javascript
jQuery实现鼠标选文字发新浪微博的方法
Apr 02 Javascript
深入解析JavaScript中的arguments对象
Jun 12 Javascript
JavaScript浮点数及运算精度调整详解
Oct 21 Javascript
详解Vue2.0之去掉组件click事件的native修饰
Apr 20 Javascript
基于react组件之间的参数传递(详解)
Sep 05 Javascript
jQuery实现菜单的显示和隐藏功能示例
Jul 24 jQuery
vue this.reload 方法 配置
Sep 12 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
删除无限级目录与文件代码共享
2006/07/12 PHP
分享下PHP register_globals 值为on与off的理解
2013/09/26 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
Python AES加密模块用法分析
2017/05/22 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
原生CSS实现文字无限轮播的通用方法
2021/03/30 HTML / CSS
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
《Estab Life》4月6日播出 正式PV、主视觉图公开
2022/03/20 日漫
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS