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函数的延迟加载实现代码
Oct 11 Javascript
js 三级关联菜单效果实例
Aug 13 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
Mar 18 Javascript
js检测输入内容全为空格的方法
May 03 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
Sep 17 Javascript
JavaScript实现横向滑出的多级菜单效果
Oct 09 Javascript
JS实现漂亮的时间选择框效果
Aug 20 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
May 08 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
Jan 29 jQuery
Vue+Node实现的商城用户管理功能示例
Dec 23 Javascript
原生js实现贪吃蛇游戏
Oct 26 Javascript
在VUE中使用lodash的debounce和throttle操作
Nov 09 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
长波有什么东西
2021/03/01 无线电
php _autoload自动加载类与机制分析
2012/02/10 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
php根据日期判断星座的函数分享
2014/02/13 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
Python使用numpy实现BP神经网络
2018/03/10 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
深入了解Python 方法之类方法 &amp; 静态方法
2020/08/17 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
简述Html5 IphoneX 适配方法
2018/02/08 HTML / CSS
美国批发零售网站:GearXS
2016/07/26 全球购物
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
维德科技C#面试题笔试题
2015/12/09 面试题
商业房地产广告语
2014/03/13 职场文书
大二学习计划书范文
2014/04/27 职场文书
2019年教师入党申请书
2019/06/27 职场文书
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL
MySQL实战记录之如何快速定位慢SQL
2022/03/23 MySQL