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 相关文章推荐
node.js中的path.sep方法使用说明
Dec 08 Javascript
Jquery $when done then的用法详解
May 20 Javascript
关于原生js中bind函数的简单实现
Aug 10 Javascript
JS实现图片放大镜插件详解
Nov 06 Javascript
layui点击导航栏刷新tab页的示例代码
Aug 14 Javascript
angular 服务的单例模式(依赖注入模式下)详解
Oct 22 Javascript
微信小程序实现简单表格
Feb 14 Javascript
Vue-cli3简单使用(图文步骤)
Apr 30 Javascript
js逆向解密之网络爬虫
May 30 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
Aug 02 Javascript
vue实现手机端省市区区域选择
Sep 27 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
Jul 31 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
php2html php生成静态页函数
2008/12/08 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
PHP中strtr字符串替换用法详解
2014/11/26 PHP
PHP数组相关函数汇总
2015/03/24 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
利用Query+bootstrap和js两种方式实现日期选择器
2017/01/10 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
2017/10/09 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
python统计日志ip访问数的方法
2015/07/06 Python
详解django三种文件下载方式
2018/04/06 Python
python虚拟环境迁移方法
2019/01/03 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
Java基础知识面试题
2014/03/25 面试题
大学生党课思想汇报
2013/12/29 职场文书
演讲稿开场白
2014/01/13 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
在职证明格式样本
2015/06/15 职场文书
公司人事管理制度
2015/08/05 职场文书
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android