- 浏览: 43059 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
天使建站:
这里这篇文章更详细 还有完整的实例演示:js跳出循环:brea ...
js学习break、continue、return、witch等语句 -
FX夜归人:
var sm = new Ext.grid.CheckboxS ...
Ext.grid.CheckboxSelectionModel 只能选一行,不能全选和多选
在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments
Arguments
该对象代表正在执行的函数和调用它的函数的参数。
[function.]arguments[n]
参数
function :选项。当前正在执行的 Function 对象的名字。
n :选项。要传递给 Function 对象的从0开始的参数值索引。
说明
Arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象。Arguments是一个类似数组但不是数组的对象,说它类似数组是因为其具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表,而且不能显式创建 arguments 对象。arguments 对象只有函数开始时才可用。下边例子详细说明了这些性质:
在此添加了一个说明arguments不是数组(Array类)的代码:
运行代码你会发现第一个alert显示1,这表示数组对象拥有selfvalue属性,值为1,而当你调用函数testAguments时,你会发现显示的是“undefined”,说明了不是arguments的属性,即arguments并不是一个数组对象。
在此附加上大家推荐的一个简单方法:
caller
返回一个对函数的引用,该函数调用了当前函数。
functionName.caller
functionName 对象是所执行函数的名称。
说明
对于函数来说,caller 属性只有在函数执行时才有定义。如果函数是由顶层调用的,那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller 属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本。
下面的例子说明了 caller 属性的用法:
callee
返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。
[function.]arguments.callee
可选项 function 参数是当前正在执行的 Function 对象的名称。
说明
callee 属性的初始值就是正被执行的 Function 对象。
callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名
函数的递归或者保证函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性
仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性,这个属性有时候
用于验证还是比较好的。arguments.length是实参长度,arguments.callee.length是
形参长度,由此可以判断调用时形参长度是否和实参长度一致。
示例
比较一般的递归函数:
调用时:alert(sum(100));
其中函数内部包含了对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应用另一个函数(类)以后,当前的
函数(类)就具备了另一个函数(类)的方法或者是属性,这也可以称之为“继承”。看下面示例:
上面的例子可以看出,通过call之后,extend可以继承到base的方法和属性。
顺便提一下,在javascript框架prototype里就使用apply来创建一个定义类的模式,
其实现代码如下:
解析:从代码看,该对象仅包含一个方法:Create,其返回一个函数,即类。但这也同时是类的
构造函数,其中调用initialize,而这个方法是在类创建时定义的初始化函数。通过如此途径,
就可以实现prototype中的类创建模式
示例:
更详细的关于prototype信息请到其官方网站查看。
转自:http://www.cnblogs.com/sunwangji/archive/2006/08/21/482341.html
以下摘自《Javascript高级程序设计第三版》:
arguments的callee属性,是一个指针,指向拥有这个arguments对象的函数。
this引用的是函数据以执行的环境对象--或者也可以说是this值(当在网页的全局作用域中调用函数是,this对象引用的就是window)。
函数对象的caller属性,这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为null。
当函数在严格模式下运行时,访问arguments.callee会导致错误。ECMAScript5还定义了arguments.caller属性,但在严格模式下访问它也会导致错误,而在非严格模式下这个属性始终是undefined。定义这个属性是为了分清arguments.caller和函数的caller属性。以上变化都是为了加强这门语言的安全性,这样第三方代码就不能在相同的环境里窥视其他代码了。
严格模式还有一个限制:不能为函数的caller属性赋值,否则会导致错误。
函数属性和方法
每个函数都包含两个属性:length和prototype。其中,length属性标识函数希望接收的命名参数的个数。
对于ECMAScript中的引用类型而言,prototype是保存他们所有实例方法的真正所在。换句话说,诸如toString()和valueOf()等方法实际上都保存在prototype名下,只不过是通过各自对象的实例访问罢了。在ECMAScript中,prototype属性是不可枚举的,因此使用for-in无法实现。
每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。首先,apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是Array的实例,也可以是arguments对象。(注:在严格模式下,未指定环境对象而调用函数,则this值不会转型为window。除非明确把函数添加到某个对象或者调用apply()或call(),否则this值将是undefined),如sum.apply(this,arguments); sum.apply(this,[num1,num2])
call()方法与apply()方法的作用相同,他们的区别仅在于接受参数的方式不同。对于call()方法而言,第一个参数是this值没有变化,变化的是其余参数都直接传递给参数。如:sum.call(this,num1,num2);
事实上,传递参数并非apply()和call()真正的用武之地;它们真正强大的地方是能够扩充函数蓝衣运行的作用域。如:
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
使用call()(或apply())来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。
ECMAScript5还定义了一个方法:bind()。这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。如:
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
Arguments
该对象代表正在执行的函数和调用它的函数的参数。
[function.]arguments[n]
参数
function :选项。当前正在执行的 Function 对象的名字。
n :选项。要传递给 Function 对象的从0开始的参数值索引。
说明
Arguments是进行函数调用时,除了指定的参数外,还另外创建的一个隐藏对象。Arguments是一个类似数组但不是数组的对象,说它类似数组是因为其具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表,而且不能显式创建 arguments 对象。arguments 对象只有函数开始时才可用。下边例子详细说明了这些性质:
//arguments 对象的用法。 function ArgTest(a, b){ var i, s = "The ArgTest function expected "; var numargs = arguments.length; // 获取被传递参数的数值。 var expargs = ArgTest.length; // 获取期望参数的数值。 if (expargs < 2) s += expargs + " argument. "; else s += expargs + " arguments. "; 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"; } return(s); // 返回参数列表。 }
在此添加了一个说明arguments不是数组(Array类)的代码:
Array.prototype.selfvalue = 1; alert(new Array().selfvalue); function testAguments(){ alert(arguments.selfvalue); }
运行代码你会发现第一个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 属性的用法:
// caller demo { function callerDemo() { if (callerDemo.caller) { var a= callerDemo.caller.toString(); alert(a); } else { alert("this is a top function"); } } function handleCaller() { callerDemo(); }
callee
返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。
[function.]arguments.callee
可选项 function 参数是当前正在执行的 Function 对象的名称。
说明
callee 属性的初始值就是正被执行的 Function 对象。
callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名
函数的递归或者保证函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性
仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性,这个属性有时候
用于验证还是比较好的。arguments.length是实参长度,arguments.callee.length是
形参长度,由此可以判断调用时形参长度是否和实参长度一致。
示例
//callee可以打印其本身 function calleeDemo() { alert(arguments.callee); } //用于验证参数 function calleeLengthDemo(arg1, arg2) { if (arguments.length==arguments.callee.length) { window.alert("验证形参和实参长度正确!"); return; } else { alert("实参长度:" +arguments.length); alert("形参长度: " +arguments.callee.length); } } //递归计算 var sum = function(n){ if (n <= 0) return 1; else return n +arguments.callee(n - 1) }
比较一般的递归函数:
var sum = function(n){ if (1==n) return 1; else return n + sum (n-1);
调用时:alert(sum(100));
其中函数内部包含了对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应用另一个函数(类)以后,当前的
函数(类)就具备了另一个函数(类)的方法或者是属性,这也可以称之为“继承”。看下面示例:
// 继承的演示 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); }
上面的例子可以看出,通过call之后,extend可以继承到base的方法和属性。
顺便提一下,在javascript框架prototype里就使用apply来创建一个定义类的模式,
其实现代码如下:
var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } }
解析:从代码看,该对象仅包含一个方法: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信息请到其官方网站查看。
转自:http://www.cnblogs.com/sunwangji/archive/2006/08/21/482341.html
以下摘自《Javascript高级程序设计第三版》:
arguments的callee属性,是一个指针,指向拥有这个arguments对象的函数。
this引用的是函数据以执行的环境对象--或者也可以说是this值(当在网页的全局作用域中调用函数是,this对象引用的就是window)。
函数对象的caller属性,这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为null。
当函数在严格模式下运行时,访问arguments.callee会导致错误。ECMAScript5还定义了arguments.caller属性,但在严格模式下访问它也会导致错误,而在非严格模式下这个属性始终是undefined。定义这个属性是为了分清arguments.caller和函数的caller属性。以上变化都是为了加强这门语言的安全性,这样第三方代码就不能在相同的环境里窥视其他代码了。
严格模式还有一个限制:不能为函数的caller属性赋值,否则会导致错误。
函数属性和方法
每个函数都包含两个属性:length和prototype。其中,length属性标识函数希望接收的命名参数的个数。
对于ECMAScript中的引用类型而言,prototype是保存他们所有实例方法的真正所在。换句话说,诸如toString()和valueOf()等方法实际上都保存在prototype名下,只不过是通过各自对象的实例访问罢了。在ECMAScript中,prototype属性是不可枚举的,因此使用for-in无法实现。
每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。首先,apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是Array的实例,也可以是arguments对象。(注:在严格模式下,未指定环境对象而调用函数,则this值不会转型为window。除非明确把函数添加到某个对象或者调用apply()或call(),否则this值将是undefined),如sum.apply(this,arguments); sum.apply(this,[num1,num2])
call()方法与apply()方法的作用相同,他们的区别仅在于接受参数的方式不同。对于call()方法而言,第一个参数是this值没有变化,变化的是其余参数都直接传递给参数。如:sum.call(this,num1,num2);
事实上,传递参数并非apply()和call()真正的用武之地;它们真正强大的地方是能够扩充函数蓝衣运行的作用域。如:
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
使用call()(或apply())来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。
ECMAScript5还定义了一个方法:bind()。这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。如:
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
发表评论
-
DOM扩展
2014-02-24 15:06 663对DOM的两个主要的扩展 ... -
COM对象
2014-02-23 15:51 4111、COM COM:The Component Object ... -
客户端检测
2014-02-20 14:12 3201客户端检测是javascript开发中最具争议的一个话题。由于 ... -
javascript基础知识(二)
2014-02-17 11:30 0函数表达式 定义函数的方式有两种,一种是函数声明,另一种就是 ... -
javascript基础知识(一)
2014-02-14 10:33 4461、Boolean类型 var flaseObject = n ... -
鼠标定位
2013-11-25 15:10 539当我们单击或移动鼠标时,一般都需要获得鼠标位置,其位置可分为C ... -
js 添加事件 attachEvent 和 addEventListener 的用法
2013-11-25 10:42 670一般我们在JS中添加事件,是这样子的 1 obj.onclic ... -
JavaScript数组
2013-11-21 11:05 456JavaScript数组是有序集合,它包含堆栈、队列等数 ... -
再论call和apply
2013-11-11 15:34 410因为继续研究Ajax Framework的原因,更多的接触了c ... -
IE下使用excanvas.js的注意事项
2013-10-16 09:53 1245下载网址:http://code.google.com/p/e ... -
JS判断浏览器类型方法
2013-10-16 09:42 2111方法一: 2009-05-29 23:01 ... -
网站如何做到 jQuery-free?
2013-06-14 14:45 833本文转载自ITeye新闻月 ... -
js学习break、continue、return、witch等语句
2013-04-25 17:23 19811、break语句 break语句会使运行的程序立刻退出包含在 ... -
js == 与 === 的区别
2013-04-18 17:22 640”==”与”===”是不同 ... -
javascript eval和JSON之间的联系
2012-12-27 13:13 734javascript eval和JSON之间的联系 如果您想 ...
相关推荐
理解JavaScript的caller callee call apply
NULL 博文链接:https://cuckoosnest.iteye.com/blog/470131
NULL 博文链接:https://davidxiaozhi.iteye.com/blog/1026937
Javascript – 全面理解 caller,callee,call,apply Author: BlueDestiny, never-online From: http://www.never-online.net, Blog.csdn.net/BlueDestiny 1、caller JScript参考中说明为:返回一个对函数的...
理解Javascript的caller,callee,call,apply区别
挺好的,虽然我用的是jQuery,但感觉还是有些用的~~~
主要介绍了javascript中call,apply,callee,caller用法,结合实例形式分析了javascript中call,apply,callee,caller功能、使用方法及相关操作注意事项,需要的朋友可以参考下
在看到大家如此关注JS里头的这几个对象,我试着把原文再修改一下,力求能再详细的阐明个中意义
1.2、理解闭包 二、对象 2.1、对象常量(字面量) 2.2、取值 2.3、枚举(遍历) 2.4、更新与添加 2.5、对象的原型 2.6、删除 2.7、封装 三、函数 3.1、参数对象 (arguments) 3.2、构造函数 3.3、函数调用 3.3.1、...
JavaScript权威指南 犀牛书 Chapter 1. Introduction to JavaScript Section 1.1. JavaScript Myths Section 1.2. Versions of JavaScript Section 1.3. Client-Side JavaScript Section 1.4. JavaScript ...
callee 属性 返回正执行的函数对象,它是指定的函数对象的文本正文。 caller 属性 返回调用当前函数的函数引用。 catch 语句 包含在 try 语句块中的代码发生错误时执行的语句。 ceil 方法 返回大于或等于其数值...
正则表达式 call(),apply(),callee,caller,cookie方法,setInterval(),clearInterval(),setTimeout() ,clearTimeout()
javascript的官方文档 这些方便实用的信息将帮助您了解 JScript 的各个部分。 在“字母顺序的关键字列表”中,可以找到按字母顺序列出的所有 JScript 语言的主题。如果只需要查看某个主题(例如对象),则有对该主题...