JS中使用变量保存arguments对象的方法

迭代器(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实现

对设计模式了解一点点,但具体项目中,有得多的也就是工厂模式,其它很少用,下面是一个简单的实现,不对的地方,欢迎交流。

代码如下

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对象的方法,希望对大家有所帮助!

(0)

相关推荐

  • linux bash中too many arguments问题的解决方法

    判断一个文件的内容是不是为空,使用语句: if test -z `cat filename` 当filename为空或者只有一行没有空格的字符串的时候,一切正常,反之,则会报:too many arguments,甚至是: binary operator expected之类的错误. 参考文章:http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/index.html 原因分析:filename中的空格回车等迷惑了bash.如果

  • JS函数arguments数组获得实际传参数个数的实现方法

    JS与PHP在函数传参方面有点不同,PHP形参与实参个数要匹配,而JS就灵活多了,可以随意传参,实参比形参少或多都不会报错. 实参比形参多不会报错 function say(a){ alert(a); } say('琼台博客','WEB技术博客'); 执行结果 我们再来看看形参比实参多的结果 function say(a,b){ alert('a 的值是 '+a+'\nb 的值是 '+b); } say('琼台博客'); 执行结果 a 对应第一个实参"琼台博客",b 没有对应的实参所以

  • 深入解析JavaScript中的arguments对象

    arguments定义 所有的函数都有一个自己的arguments对象,用来储存它实际接受到的参数,而不局限于函数声明时所定义的参数列表.它不是数组却类似数组,具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length.但是却不具有数组的一些方法.可以通过call把arguments转化成真正的数组,然后进行数组的操作. var args = Array.prototype.slice.call(arguments); 类数组 1. 判断

  • js arguments,jcallee caller用法总结

    关键字:arguments,callee,callerarguments:表示传入函数的参数callee:表示函数和函数主体的语句caller:表示调用该函数的函数arguments 该对象代表正在执行的函数和调用它的函数的参数. caller 返回一个对函数的引用,该函数调用了当前函数.functionName.callerfunctionName 对象是所执行函数的名称. 说明对于函数来说,caller属性只有在函数执行时才有定义.如果函数是由顶层调用的,那么 caller包含的就是 nul

  • javascript内置对象arguments详解

    一.什么是argumentsarguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments对象.所以agruments对象对于javascript程序员来说是必需熟悉的.所有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数.他不是一个数组,如果用typeof arguments,返回的是'object'.虽然我们可以用调用数据的方法来调用arguments.比如length,还有

  • Javascript中函数名.length属性用法分析(对比arguments.length)

    本文实例分析了Javascript中函数名.length属性用法.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"&g

  • javascript 利用arguments实现可变长参数

    javascript arguments解释,实现可变长参数. 在C#中,有可变长参数params[],但是在js中,如何实现这种可变参数呢? 一.可变长参数 arguments是非常好的解决方法,一直不知道javascript有这个东西. 先来看看应用场景,使用arguments传入任意个数的参数到js函数里的写法. function Test() { console.log(arguments[0]); console.log(arguments[1]); console.log(argum

  • JS中call/apply、arguments、undefined/null方法详解

    a.call和apply方法详解 -------------------------------------------------------------------------------- call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指

  • js中arguments的用法(实例讲解)

    如下所示: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8&qu

  • js中arguments,caller,callee,apply的用法小结

    在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n]参数function :选项.当前正在执行的 Function 对象的名字. n :选项.要传递给 Function 对象的从0开始的参数值索引. 说明Arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象.Arguments是一个类似数组但不是数组的对象,说它类似数组是

  • arguments对象验证函数的参数是否合法

    使用arguments对象验证函数的参数是否合法 <script> function sum(arg1,arg2) //加法函数 { var realArgCount = arguments.length; //调用函数时传递的实参个数 var frmArgCount = sum.length; //函数定义时的形参个数 if(realArgCount < frmArgCount) //如果实际参数个数小于形参个数 { var e = new Error(); //定义错误信息,然后抛出

  • window.dialogArguments 使用说明

    f1.php页面JS代码,第二个传的参数必须是self不能是别的 复制代码 代码如下: <script type="text/javascript"> function dianJi(){ //弹出窗口关闭前,原窗口不能获得焦点 //showModalDialog("f2.php",self,"dialogwidth=500px;dialogheight=500px;dialogtop=100px;dialogleft=100px;center

  • Javascript中的arguments对象

    在js中一切都是对象,连函数也是对象,函数名其实是引用函数定义对象的变量. 1.什么是arguments? 这个函数体内的arguments非常特殊,实际上是所在函数的一个内置类数组对象,可以用数组的[i]和.length. 2.有什么作用? js语法不支持重载!但可用arguments对象模拟重载效果. arguments对象:函数对象内,自动创建的专门接收所有参数值得类数组对象. arguments[i]: 获得传入的下标为i的参数值 arguments.length: 获得传入的参数个数!

  • javascript arguments使用示例

    复制代码 代码如下: <script Language="JavaScript"> //第一个参数值. function test(a,b,c,d){   alert(arguments[0]); } //arguments[0]实际上就是a,同理,arguments[1]就是b,依次c,d </script> 复制代码 代码如下: <script Language="JavaScript"> {     function fun

  • 深入理解JS函数的参数(arguments)的使用

    JS函数的参数在function内可以用arguments对象来获取. 参数的调用有两种方式: 1.期望参数的使用. 2.实际传递参数的使用. 应用举例: function Test(a, b){ var i, s = "Test函数有"; var numargs = arguments.length; // 获取实际被传递参数的数值. var expargs = Test.length; // 获取期望参数的数值,函数定义时的预期参数个数(有a和b 2个参数). s += (expa

  • js的隐含参数(arguments,callee,caller)使用方法

    在提到上述的概念之前,首先想说说javascript中函数的隐含参数: arguments arguments 该对象代表正在执行的函数和调用它的函数的参数.[function.]arguments[n]参数function:选项.当前正在执行的 Function 对象的名字. n :选项.要传递给 Function 对象的从0开始的参数值索引.说明Arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象.Arguments是一个类似数组但不是数组的对象,说它类似数组是因为

  • JavaScript中使用arguments获得函数传参个数实例

    JS与PHP在函数传参方面有点不同,PHP形参与实参个数要匹配,而JS就灵活多了,可以随意传参,实参比形参少或多都不会报错. 实参比形参多不会报错 function say(a){    alert(a); }   say('琼台博客','WEB技术博客'); 执行结果 我们再来看看形参比实参多的结果 function say(a,b){    alert('a 的值是 '+a+'\nb 的值是 '+b); }   say('琼台博客'); 执行结果 a 对应第一个实参"琼台博客",b

  • 跟我学习javascript的arguments对象

    1.什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments对象.所以agruments对象对于javascript程序员来说是必需熟悉的.在javascript函数体内,标识符arguments具有特殊含义.它是调用对象的一个特殊属性,用来引用Arguments对象.Arugments对象就像数组,注意这里只是像并不是哈. javascript函数体内,argument

随机推荐