- 浏览: 45024 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
天使建站:
这里这篇文章更详细 还有完整的实例演示: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 723对DOM的两个主要的扩展 ... -
COM对象
2014-02-23 15:51 4471、COM COM:The Component Object ... -
客户端检测
2014-02-20 14:12 3239客户端检测是javascript开发中最具争议的一个话题。由于 ... -
javascript基础知识(二)
2014-02-17 11:30 0函数表达式 定义函数的方式有两种,一种是函数声明,另一种就是 ... -
javascript基础知识(一)
2014-02-14 10:33 5121、Boolean类型 var flaseObject = n ... -
鼠标定位
2013-11-25 15:10 577当我们单击或移动鼠标时,一般都需要获得鼠标位置,其位置可分为C ... -
js 添加事件 attachEvent 和 addEventListener 的用法
2013-11-25 10:42 697一般我们在JS中添加事件,是这样子的 1 obj.onclic ... -
JavaScript数组
2013-11-21 11:05 495JavaScript数组是有序集合,它包含堆栈、队列等数 ... -
再论call和apply
2013-11-11 15:34 439因为继续研究Ajax Framework的原因,更多的接触了c ... -
IE下使用excanvas.js的注意事项
2013-10-16 09:53 1276下载网址:http://code.google.com/p/e ... -
JS判断浏览器类型方法
2013-10-16 09:42 2187方法一: 2009-05-29 23:01 ... -
网站如何做到 jQuery-free?
2013-06-14 14:45 904本文转载自ITeye新闻月 ... -
js学习break、continue、return、witch等语句
2013-04-25 17:23 20471、break语句 break语句会使运行的程序立刻退出包含在 ... -
js == 与 === 的区别
2013-04-18 17:22 673”==”与”===”是不同 ... -
javascript eval和JSON之间的联系
2012-12-27 13:13 767javascript eval和JSON之间的联系 如果您想 ...
相关推荐
### 理解JavaScript中的`caller`, `callee`, `call`, `apply` #### Arguments对象:JavaScript函数调用的参数管理器 在JavaScript中,每个函数都有一个隐含参数`arguments`,它允许开发者访问传递给函数的所有参数...
这篇文章将深入探讨四个关键概念:caller、callee、call和apply,它们都是JavaScript函数操作的核心部分,对于理解和使用高级JavaScript编程至关重要。 首先,我们来了解`caller`和`callee`。在JavaScript的函数...
在JavaScript的世界里,caller、callee、call和apply是四个非常重要的概念,它们涉及到函数的调用方式和执行上下文。这些知识点对于深入理解和优化代码至关重要,尤其在处理高阶函数和面向对象编程时。 首先,让...
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` #### Arguments对象 在深入了解`caller`, `callee`, `call`, 和 `apply` 之前,我们先来看看`arguments`对象。`arguments`对象是在JavaScript函数内部...
### 理解JavaScript中的`caller`, `callee`, `call`, `apply`的区别 #### 一、`arguments`对象 在深入探讨`caller`, `callee`, `call`, 和`apply`之前,我们先来了解一个重要的概念——`arguments`对象。 **`...
JavaScript中arguments、caller、callee、call和apply是与函数相关的几个重要概念和对象。它们为JavaScript的函数提供了非常灵活的功能,特别是在处理函数参数和调用上下文方面。接下来,将对这些概念逐一进行详细...
主要介绍了javascript中call,apply,callee,caller用法,结合实例形式分析了javascript中call,apply,callee,caller功能、使用方法及相关操作注意事项,需要的朋友可以参考下
JavaScript中的原型对象、this的五种用法、原型继承以及Caller和Callee的使用是JavaScript编程中的核心概念。首先,让我们深入理解每个概念。 **原型对象(Prototype)** 在JavaScript中,每当定义一个函数,都会...
在JavaScript编程中,apply、call、caller、callee和bind是与函数相关的几个重要概念,它们都与函数的this上下文相关,以及如何控制函数的调用方式。接下来,我们将详细分析这些方法的使用方法和区别。 ### call...
### 知识点一:JavaScript中的call()和apply()方法定义 #### call()方法定义: call()方法属于Function对象的一个方法,它允许我们调用一个函数,并且可以改变该函数的上下文。换句话说,call()方法能够指定函数...
4. **ES6的箭头函数**:箭头函数没有自己的`this`、`arguments`、`.call`、`.apply`和`.constructor`等方法,因此它们无法使用`arguments.callee`。在ES6中,通常建议使用`let`或`const`来声明一个内部函数,然后...
本文将深入探讨Javascript中动态方法调用与参数修改涉及的知识点,帮助读者更好地理解这些高级特性。 首先,Javascript中的函数是一等公民,这意味着函数可以作为参数传递给其他函数,可以从其他函数返回,也可以...
在函数调用中,`this`的确定较为复杂,需要根据调用方式(常规调用、apply/call方法、箭头函数等)来判断。 6. **函数属性**: - `caller`属性:在非严格模式下,`caller`属性表示调用当前函数的函数,但在ES5中已...
3. **`callee`与`caller`属性**:`callee`属性可用于递归调用,而`caller`属性则可以获取调用当前函数的父函数。 4. **`apply`与`call`方法**:用于绑定函数的执行上下文,`call`接受一系列参数,`apply`则接受参数...
正则表达式 call(),apply(),callee,caller,cookie方法,setInterval(),clearInterval(),setTimeout() ,clearTimeout()