- 浏览: 13731065 次
- 性别:
- 来自: 洛杉矶
文章分类
- 全部博客 (1994)
- Php / Pear / Mysql / Node.js (378)
- Javascript /Jquery / Bootstrap / Web (435)
- Phone / IOS / Objective-C / Swift (137)
- Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux (335)
- Perl / Koha / Ruby / Markdown (8)
- Java / Jsp (12)
- Python 2 / Wxpython (25)
- Codeigniter / CakePHP (32)
- Div / Css / XML / HTML5 (179)
- WP / Joomla! / Magento / Shopify / Drupal / Moodle / Zimbra (275)
- Apache / VPN / Software (31)
- AS3.0/2.0 / Flex / Flash (45)
- Smarty (6)
- SEO (24)
- Google / Facebook / Pinterest / SNS (80)
- Tools (22)
最新评论
-
1455975567:
xuezhongyu01 写道wocan23 写道我想问下那个 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
xuezhongyu01:
wocan23 写道我想问下那个111.1是怎么得来的我也看不 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
18335864773:
试试 pageoffice 在线打开 PDF 文件吧. pag ...
jquery在线预览PDF文件,打开PDF文件 -
青春依旧:
opacity: 0.5; 个人喜欢这种方式!关于其他css特 ...
css透明度的设置 (兼容所有浏览器) -
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
搞定网页打印自动分页问题
javascript下的arguments,caller,callee,call,apply示例及理解
Arguments
该对象代表正在执行的函数和调用它的函数的参数。
[function.]arguments[n]
参数
function :选项。当前正在执行的 Function 对象的名字。
n :选项。要传递给 Function 对象的从0开始的参数值索引。
说明
Arguments
是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象。Arguments是一个类似数组但不是数组的对象,说它类似数组是因为其具有数组一样
的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是
实际传递给函数的参数,而不局限于函数声明所定义的参数列表,而且不能显式创建 arguments 对象。arguments
对象只有函数开始时才可用。下边例子详细说明了这些性质:
<script type="text/javascript"> //arguments 对象的用法。 function ArgTest(a, b){ var i, s = "The ArgTest function expected \n\n"; var numargs = arguments.length; // 获取被传递参数的数值。 var expargs = ArgTest.length; // 获取期望参数的数值。 if (expargs < 2){ s += expargs + " argument. "; }else{ s += expargs + " arguments. "; } s += "\n\n"; if (numargs < 2){ s += numargs + " was passed."; }else{ s += numargs + " were passed."; } s += "\n\n"; for (i =0 ; i < numargs; i++){ // 获取参数内容。 s += " Arg " + i + " = " + arguments[i] + "\n"; } alert(s); // 返回参数列表。 } ArgTest(1,2); </script>
在此添加了一个说明arguments不是数组(Array类)的代码:
<script type="text/javascript"> Array.prototype.selfvalue = 1; alert(new Array().selfvalue); function testAguments(){ alert(arguments.selfvalue); } testAguments() </script>
运行代码你会发现第一个alert显示1,这表示数组对象拥有selfvalue属性,值为1,而当你调用函数testAguments时,你会
发现显示
的是“undefined”,说明了不是arguments的属性,即arguments并不是一个数组对象。
在此附加上大家推荐的一个简单方
法:
alert(arguments instanceof Array); alert(arguments instanceof Object);
caller
返回一个对函数的引用,该函数调用了当前函数。
functionName.caller
functionName 对象是所执行函数的名称。
说明
对于函数来说,caller
属性只有在函数执行时才有定义。如果函数是由顶层调用的,那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller
属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本。
下面的例子说明了 caller
属性的用法:
<script type="text/javascript"> // caller demo { function callerDemo() { if (callerDemo.caller) { var a= callerDemo.caller.toString(); alert(a); } else { alert("this is a top function"); } } function handleCaller() { callerDemo(); } callerDemo(); handleCaller(); </script>
callee
返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。
[function.]arguments.callee
可选项 function 参数是当前正在执行的 Function 对象的名称。
说明
callee
属性的初始值就是正被执行的 Function 对象。
callee 属性是 arguments
对象的一个成员,它表示对函数对象本身的引用,这有利于匿名
函数的递归或者保证函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该
属性
仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性,这个属性有时候
用于验证还是比较好的。
arguments.length是实参长度,arguments.callee.length是
形参长度,由此可以判断调用时形参长度是否和
实参长度一致。
示例
<script type="text/javascript"> //callee可以打印其本身 function calleeDemo() { alert(arguments.callee); } //用于验证参数 function calleeLengthDemo(arg1, arg2) { if (arguments.length==arguments.callee.length) { alert("验证形参和实参长度正确!"); } else { alert("实参长度:" + arguments.length); alert(" 形参长度: " + arguments.callee.length); } } calleeDemo('1','2'); calleeLengthDemo('1','2'); calleeLengthDemo('1'); //递归计算 var sum = function(n){ if (1==n) { return 1; }else{ return n + sum (n-1); } } alert(sum(100)); </script>
其中函数内部包含了对sum自身的引用,函数名仅仅是一个变量名,在函数内部调用sum即相当于调用
一个全局变量,不能很好的体现出是调用自
身,这时使用callee会是一个比较好的方法。
apply and call
它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所
区别:
apply(thisArg,argArray);
call(thisArg[,arg1,arg2…] ]);
即
所有函数内部的this指针都会被赋值为thisArg,这可实现将函数作为另外一个对象的方法运行的目的
apply的说明
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提
供 argArray 和 thisArg任何一个参数,那么 Global 对象将被用作 thisArg, 并且无法被传递任何参数。
call
的说明
call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisArg指定的新对象。
如果没有提
供 thisArg参数,那么 Global 对象被用作 thisArg
相关技巧:
应用call和apply还有一个技巧在里面,
就是用call和apply应用另一个函数(类)以后,当前的
函数(类)就具备了另一个函数(类)的方法或者是属性,这也可以称之为“继承”。
看下面示例:
<script type="text/javascript"> // 继承的演示 function base() { this.member = "dnnsun_Member"; this.method = function() { window.alert(this.member); } } function extend() { base.call(this); window.alert(member); window.alert(this.method); } base(); extend(); </script>
上面的例子可以看出,通过call之后,extend可以继承到base的方法和属性。
顺便提一下,在javascript框架
prototype里就使用apply来创建一个定义类的模式,
其实现代码如下:
<script type="text/javascript"> var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } </script>
解析:从代码看,该对象仅包含一个方法:Create,其返回一个函数,即类。但这也同时是类的构造函数,其中调用initialize,而这
个方法是在类创建时定义的初始化函数。通过如此途径,就可以实现prototype中的类创建模式
示例:
var vehicle=Class.create(); vehicle.prototype={ initialize:function(type){ this.type=type; } showSelf:function(){ alert("this vehicle is "+ this.type); } } var moto=new vehicle("Moto"); moto.showSelf();
更详细的关于prototype信息请到其官方网站查看。
评论还有更精彩对此的理解,在这我就不再添加了,大家可以看看加深理解。
看
完了上面的代码,就可以,下面的代码是给一些比较想立即看到效果的人看的。多测试。
<script language="JavaScript"> /**//* * 演示arguments的用法,如何获取实参数和形数数 */ function argTest(a,b,c,d){ var numargs = arguments.length; // 获取被传递参数的数值。 var expargs = argTest.length; // 获取期望参数的数值。 alert("实参数目为:"+numargs); alert("形数数目为:"+expargs); alert(arguments[0]); alert(argTest[0]); //undefined 没有这种用法 } //argTest(1,2) //结果:实参数目为:2;形数数目为:4;1;undefined //argTest(1,2,3,4,5) //结果:实参数目为:5;形数数目为:4;1;undefined /*总结:js参数传递不像c#等语法要求的必须与函数定义一致,可以根据应用不同增加或减少参数,极端情况可以不声明参数,如*/ var test = function(){ var a = 0; var l = 0; while(l<arguments.length){ a += arguments[l]; l++; } alert(a); } test();//0 test(1,2);//3 /**//* * arguments不是数组(Array类) */ Array.prototype.selfvalue = 1; //此处就是为人诟病的渲染原声对象吧 function testAguments(){ alert("arguments.selfvalue="+arguments.selfvalue); } //alert("Array.sefvalue="+new Array().selfvalue); /*上面的调用说明所有Array对象的selfvalue都等于1*/ //testAguments(); /*结果undefined说明 arguments并非Array类型*/ /**//* * 演示函数的caller属性. * 说明:(当前函数).caller:返回一个对函数的引用,该函数调用了当前函数 */ function callerDemo() { if (callerDemo.caller) { var a= callerDemo.caller.arguments[0]; alert(a); } else { alert("this is a top function"); } } function handleCaller() { callerDemo(); } //callerDemo(); //结果:this is a top function //handleCaller("参数1","参数2"); // 结果:参数1 /*总结:caller应用于函数对象,可以取到上层调用的函数对象及参数 */ /**//* * 演示函数的callee属性. * 说明:arguments.callee:初始值就是正被执行的 Function 对象,用于匿名函数 */ function calleeDemo() { alert(arguments.callee); } //calleeDemo(); //(function(arg0,arg1){alert("形数数目为:"+arguments.callee.length)})(); /*总结:可用于实现递归,如:*/ var i = 0; var a = function(){ i += arguments[0]; if(i>100||i==0){ alert(i); }else{ arguments.callee(i); } }; a(1); //结果128,其实就是2的7次方 /**//* * 演示apply,call函数的用法 * 说明:作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别: * apply(thisArg,argArray); * call(thisArg[,arg1,arg2…] ]); * 即所有函数内部的this指针都会被赋值为thisArg */ function ObjectA(){ alert("执行 ObjectA()"); alert(arguments[0]); this.hit=function(msg){alert(msg)} this.info="我来自ObjectA"; } function ObjectB(){ alert("执行 ObjectB()"); //调用ObjectA()方法,同时ObjectA构造函数中的所有this就会被ObjectB中的this替代 ObjectA.apply(this,arguments);//ObjectA.call(this); alert(this.info); } //ObjectB('参数0'); /*总结:通常同callee联用*/ var i = 0 function a(b){ i++; if(i>4){ return i; }else{ return arguments.callee.call(this,b); } } alert(a(0)); //讲述this作用域的问题 var value="global 变量"; function Obj(){ this.value="对象!"; } function Fun1(){ alert(this.value); } //Fun1(); //结果:global 变量 //Fun1.apply(window); //结果:global 变量,默认this=window //Fun1.apply(new Obj()); //结果:对象,this=new Obj();Obj中的this指的是函数对象实例 </script>
arguments不是数组(Array类)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <script language="JavaScript"> <!-- /** * arguments不是数组(Array类) */ Array.prototype.selfvalue = 1; function testAguments(){ alert("arguments.selfvalue=" + arguments.selfvalue); } alert("Array.sefvalue=" + new Array().selfvalue);//打印 "Array.sefvalue=1" testAguments();//打印 "arguments.selfvalue=undefined" //--> </script> </head> <body> </body> </html>
函数的callee属性
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <script language="JavaScript"> <!-- /** * 演示函数的callee属性. * 说明:arguments.callee:初始值就是正被执行的 Function 对象,用于匿名函数 */ function calleeDemo() { alert(arguments.callee); } calleeDemo(); // 打印 calleeDemo 整个函数体 (function(arg0,arg1){alert("形数数目为:"+arguments.callee.length)})();//打印 "形数数目为:2" //--> </script> </head> <body> </body> </html>
apply,call函数的用法
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <script language="JavaScript"> <!-- /** * 演示apply,call函数的用法 * 说明:作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别: * apply(thisArg,argArray); * call(thisArg[,arg1,arg2…] ]); * 即所有函数内部的this指针都会被赋值为thisArg */ function ObjectA(){ alert("执行ObjectA()"); alert(arguments[0]); this.hit=function(msg){alert(msg)} this.info="我来自ObjectA" } function ObjectB(){ alert("执行ObjectB()"); //调用ObjectA()方法,同时ObjectA构造函数中的所有this就会被ObjectB中的this替代 ObjectA.apply(this,arguments);//ObjectA.call(this); alert(this.info); this.hit("来自A的hit函数"); } /** *当ObjectB()函数中第三行为这样时: *ObjectA.apply(this,arguments); *下面的调用,依次打印: * "执行ObjectB()" * "执行ObjectA()" * "参数0" * "我来自ObjectA" * "来自A的hit函数" *----------------------------------- *当ObjectB()函数中第三行为这样时: *ObjectA.call(this); *下面的调用,依次打印: * "执行ObjectB()" * "执行ObjectA()" * "undefined" * "我来自ObjectA" * "来自A的hit函数" */ ObjectB('参数0'); //--> </script> </head> <body> </body> </html>
apply函数的演示
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <head> <script language= "JavaScript" > <!-- var value= "global 变量" ; function Obj(){ this .value= "对象!" ; } function Fun1(){ alert( this .value); } Fun1(); //打印 "global 变量" Fun1.apply(window); //打印 "global 变量" alert(window.value); //打印 "global 变量" alert(document.value); //打印 "undifined" Fun1.apply( new Obj()); //打印 "对象!" //--> </script> </head> <body> </body> </html>
发表评论
-
使用jQuery和Pure.CSS创建一个可编辑的表格
2016-08-26 02:24 1236使用开源组件真的可以 ... -
2016十大优秀jQuery插件推荐
2016-08-26 02:24 2339当有限的开发知识限制了设计进展,你无法为自己插上创新的翅膀时 ... -
jQuery .tmpl() 用法
2016-08-26 02:22 1221参考效果: DEMO 下载: jquery-tmpl-ma ... -
jQuery:从零开始,DIY一个jQuery(2)
2016-08-19 03:06 1062在上篇文章我们简单实 ... -
jQuery:从零开始,DIY一个jQuery(1)
2016-08-19 03:00 995从本篇开始会陪大家一起从零开始走一遍 jQuery 的奇妙旅 ... -
Bootstrap 3: 菜单居中 Center content in responsive bootstrap navbar
2016-08-18 06:15 1597先看上面图片的效果,下面是代码: .navbar .nav ... -
jQuery: 操作select option方法集合
2016-08-18 06:06 3351每一次操作select的时候,总是要谷歌一下资料,真是太不爽 ... -
jQuery: 插件开发模式详解 $.extend(), $.fn, $.widget()
2016-08-16 05:31 1252原文:http://www.codeceo.com/arti ... -
jQuery: 选择器(DOM,name,属性,元素)
2016-08-11 01:17 4515出处:http://www.cnblogs.com/star ... -
jQuery: 合并表格中相同文本的相邻单元格
2016-08-01 08:02 1387一、效果 二、代码 <!DOCTYPE ... -
Bootstrap 3: 使用注意box-sizing细节及解决方法
2016-08-01 07:58 1603一、bootstrap样式 在Bootstrap v3.3 ... -
域名详解
2016-07-29 12:51 863域名 域名就是用来唯 ... -
Bootstrap 3: 图标转换事件 Change icons when toggle
2016-07-20 13:39 2323代码: <link href="http: ... -
Bootstrap 3: 图标转换事件 Change icons when toggle
2016-07-19 07:12 766代码: <link href=" ... -
jQuery:无限循环两个或者多个事件 click / toggle between two functions
2016-07-19 07:12 1646插件: (function($) { $.fn. ... -
javascript 中面向对象实现 如何继承
2016-07-14 01:01 548上一篇博客已经说了关于javascript中的封装, 其中也 ... -
javascript 中的面向对象实现 如何封装
2016-07-12 12:27 1229javascript 是一门很灵活的语言,也是一门有缺陷的语 ... -
AngularJS jQuery 共存法则
2016-06-14 05:26 3628寻找正确的方法,如何在AngularJS里使用jQuery ... -
七步从Angular.JS菜鸟到专家(3):数据绑定和AJAX
2016-06-04 05:28 1165AngularJS学习列表:七步 ... -
七步从Angular.JS菜鸟到专家(2):Scopes
2016-06-04 05:27 736AngularJS学习列表:七步走 Angular.js 从 ...
相关推荐
### 理解JavaScript中的`caller`...综上所述,理解`caller`、`callee`、`call`、`apply`以及`arguments`对象在JavaScript编程中至关重要,它们不仅增强了函数的灵活性和复用性,还提供了深入分析和调试代码的强大工具。
JavaScript中arguments、caller、callee、call和apply是与函数相关的几个重要概念和对象。它们为JavaScript的函数提供了非常灵活的功能,特别是在处理函数参数和调用上下文方面。接下来,将对这些概念逐一进行详细...
这篇文章将深入探讨四个关键概念:caller、callee、call和apply,它们都是JavaScript函数操作的核心部分,对于理解和使用高级JavaScript编程至关重要。 首先,我们来了解`caller`和`callee`。在JavaScript的函数...
### 理解JavaScript中的`caller`, `callee`, `call`, `apply` #### Arguments对象 在深入了解`caller`, `callee`, `call`, 和 `apply` 之前,我们先来看看`arguments`对象。`arguments`对象是在JavaScript函数内部...
### 理解JavaScript中的`caller`, `callee`, `call`, `apply`的区别 #### 一、`arguments`对象 在深入探讨`caller`, `callee`, `call`, 和`apply`之前,我们先来了解一个重要的概念——`arguments`对象。 **`...
在JavaScript编程中,apply、call、caller、callee和bind是与函数相关的几个重要概念,它们都与函数的this上下文相关,以及如何控制函数的调用方式。接下来,我们将详细分析这些方法的使用方法和区别。 ### call...
JavaScript中的`arguments`、`callee`和`caller`是三个非常重要的概念,它们与函数的参数处理和调用栈有着密切关系。 `arguments`对象是一个类数组对象,它包含了函数被调用时的所有参数,即使这些参数没有在函数...
然而,由于 `arguments.callee` 增加了代码的耦合度,现代 JavaScript(ES5 及以后版本)更推荐使用命名函数表达式或者 `function.name` 来避免这种依赖。例如: ```javascript var Factorial = function factorial...
arguments.callee.caller.arguments[0] = 'lily'; } function fun2(name) { fun1.call(this); alert(name); // 输出 'lily' } fun2("jack"); // 此例中,通过fun1成功修改了fun2的参数值 ``` 在这个例子中,...