javascript arguments解析
在每个函数中,都有个名为 arguments 的变量,它以类似数组的形式保存了当前调用的参数。而它实际上并不是个数组,使用 typeof arguments 语句尝试会返回
“object”(对象),所以它不能像 Array 一样使用 push 和 pop 等方法。即便如此,仍然可以使用下标以及长度属性(length)获取它的值。
编写灵活的函数
arguments 是非常有用的对象。比如,可以让函数处理不定数目的参数。
在 Dean Edwards 写的 base2 库中,有个叫 format 的函数充分发挥了这一特性:
复制代码 代码示例:
function format(string) {
var args = arguments;
var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
return String(string).replace(pattern, function(match, index) {
return args[index];
});
};
这个函数实现了模板替换,可以在要动态替换的地方使用 %1 到 %9 标记,然后其余的参数就会依次替换这些地方。
例如:
复制代码 代码示例:
format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");
上面的脚本就会返回
"And the papers want to know whose shirt you wear" 。在这里需要注意的是,即便在 format 函数定义中,我们仅定义了个名为 string 的参数。而 Javascript 不管
函数自身定义的参数数量,它都允许我们向一个函数传递任意数量的参数,并将这些参数值保存到被调用函数的 arguments 对象中。
转换成实际数组
虽然 arguments 对象并不是真正意义上的 Javascript 数组,但是可以使用数组的 slice 方法将其转换成数组,类似下面的代码:
var args = Array.prototype.slice.call(arguments);
这样,数组变量 args 包含了所有 arguments 对象包含的值。
创建预置参数的函数
使用 arguments 对象能够简短我们编写的 Javascript 代码量。下面有个名为 makeFunc 的函数,它根据你提供的函数名称以及其他任意数目的参数,然后返回个匿名函数
。此匿名函数被调用时,合并的原先被调用的参数,并交给指定的函数运行然后返回其返回值。
复制代码 代码示例:
function makeFunc() {
var args = Array.prototype.slice.call(arguments);
var func = args.shift();
return function() {
return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
};
}
makeFunc 的第一个参数指定需要调用的函数名称(是的,在这个简单的例子中没有错误检查),获取以后从 args 中删除。makeFunc 返回一个匿名函数,它使用函数对象
的(Function Object)apply 方法调用指定的函数。
apply 方法的第一个参数指定了作用域,基本上的作用域是被调用的函数。不过这样在这个例子中看起来会有点复杂,所以我们将其设定成 null ;其第二个参数是个数组
,它指定了其调用函数的参数。makeFunc 转换其自身的 arguments 并连接匿名函数的 arguments,然后传递到被调用的函数。
有种情况就是总是要有个输出的模板是相同的,为了节省每次是使用上面提到的 format 函数并指定重复的参数,可以使用 makeFunc 这个工具。
它将返回一个匿名函数,并自动生成已经指定模板后的内容:
var majorTom = makeFunc(format, "This is Major Tom to ground control. I'm %1.");
可以像这样重复指定 majorTom 函数:
复制代码 代码示例:
majorTom("stepping through the door");
majorTom("floating in a most peculiar way");
那么当每次调用 majorTom 函数时,它都会使用第一个指定的参数填写已经指定的模板。例如上述的代码返回:
"This is Major Tom to ground control. I'm stepping through the door."
"This is Major Tom to ground control. I'm floating in a most peculiar way."
自引用的函数
它(arguments)还有个其他非常有用的属性:callee 。arguments.callee 包含了当前调用函数的被引用对象。
那么,如何使用这玩意做些的事情?arguments.callee 是个非常有用的调用自身的匿名函数。
下面有个名为 repeat 的函数,它的参数需要个函数引用和两个数字。
第一个数字表示运行的次数,而第二个函数定义运行的间隔时间(毫秒为单位)。
相关的代码:
复制代码 代码示例:
function repeat(fn, times, delay) {
return function() {
if(times-- > 0) {
fn.apply(null, arguments);
var args = Array.prototype.slice.call(arguments);
var self = arguments.callee;
setTimeout(function(){self.apply(null,args)}, delay);
}
};
}
repeat 函数使用 arguments.callee 获得当前引用,保存到 self 变量后,返回个匿名函数重新运行原本被调用的函数。最后使用 setTimeout 以及配合个匿名函数实现延
迟执行。
简单说明:
比如会在通常的脚本中,编写下面的提供个字符串并弹出个警告框的简单函数:
复制代码 代码示例:
function comms(s) {
alert(s);
}
编写个“特殊版本”的函数,它会重复三次运行每次间隔两秒。
那么使用 repeat 函数,就可以像这样做到:
复制代码 代码示例:
var somethingWrong = repeat(comms, 3, 2000);
somethingWrong("Can you hear me, major tom?");
结果就犹如预期的那样,弹出了三次警告框每次延时两秒。
相关热词: 解析
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jq/jc/8335.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
PHP识别相片是否是颠倒的
时间:2020-12-28
-
python编程有哪些ide
时间:2020-12-28
-
python开发工程师是做什么
时间:2020-12-28
-
php构造函数的作用
时间:2020-12-28
-
php怎么跟数据库连接
时间:2020-12-28
-
php实现顺序线性表
时间:2020-12-28
-
Python多重继承中的菱形继
时间:2020-12-28
-
php中break的作用
时间:2020-12-28
热门文章
-
php中常用的正则表达式使用方法
时间:2020-12-25
-
asp与php区别是什么?
时间:2020-12-27
-
PHP识别相片是否是颠倒的,并且重新摆正
时间:2020-12-28
-
Yii授权之基于角色的存取控制 (RBAC)
时间:2020-12-23
-
php的一键安装包有哪些 php环境搭建
时间:2020-12-19
-
php实现对图片对称加解密(适用身份证加
时间:2020-12-25
-
php如何理解面向对象
时间:2020-12-28
-
超详细分析php docker的原理及作用
时间:2020-12-27
-
Python控制Excel实现自动化办公
时间:2020-12-23
-
session的作用是什么
时间:2020-12-25
