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 相关文章推荐
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
Sep 27 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
Mar 10 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
Mar 29 Javascript
自编jQuery插件实现模拟alert和confirm
Sep 01 Javascript
js判断一个字符串是否包含一个子串的方法
Jan 26 Javascript
超赞的jQuery图片滑块动画特效代码汇总
Jan 25 Javascript
实现隔行换色效果的两种方式【实用】
Nov 27 Javascript
jquery插入兄弟节点的操作方法
Dec 07 Javascript
利用jquery禁止外层滚动条的滚动
Jan 05 Javascript
JS回调函数基本定义与用法实例分析
May 24 Javascript
如何在项目中使用log4.js的方法步骤
Jul 16 Javascript
详解JavaScript中new操作符的解析和实现
Sep 04 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
PHP Undefined index报错的修复方法
2011/07/17 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
jquery ajax例子返回值详解
2012/09/11 Javascript
详解AngularJS中module模块的导入导出
2015/12/10 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
2017/01/10 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
2019/04/02 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
Python中List.index()方法的使用教程
2015/05/20 Python
对python 自定义协议的方法详解
2019/02/13 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
什么是GWT的Module
2013/01/20 面试题
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
大一新生军训时的自我评价分享
2013/12/05 职场文书
中专生求职自荐信范文
2013/12/22 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
办公室禁烟通知
2015/04/23 职场文书
校长一岗双责责任书
2015/05/09 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
主婚人致辞精选
2015/07/28 职场文书
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers