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 相关文章推荐
html读出文本文件内容
Jan 22 Javascript
Prototype Selector对象学习
Jul 23 Javascript
javascript下判断一个元素是否存在的代码
Mar 05 Javascript
js时间日期和毫秒的相互转换
Feb 22 Javascript
js计算任意值之间随机数的方法
Jan 16 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
Apr 25 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
Jul 04 jQuery
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
Sep 21 Javascript
jquery animate动画持续运动的实例
Nov 29 jQuery
javascript代码优化的8点总结
Jan 29 Javascript
Vue + Elementui实现多标签页共存的方法
Jun 12 Javascript
VUE解决跨域问题Access to XMLHttpRequest at
May 06 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
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
Laravel 自带的Auth验证登录方法
2019/09/30 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
2019/10/17 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
IE6浏览器中window.location.href无效的解决方法
2014/11/20 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
python使用cookie库操保存cookie详解
2014/03/03 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
Linux不知道文件后缀名怎么判断文件类型
2012/04/26 面试题
外贸英语毕业生自荐信
2013/11/14 职场文书
计算机相关专业自荐信
2014/07/02 职场文书
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
2021/06/26 MySQL
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS
JS setTimeout与setInterval的区别
2022/04/20 Javascript