初学JavaScript之arguments、caller、callee、call、apply理解

同样在开始前为了方便打印,添加一个函数

Object.prototype.description = function()
{
    console.log(this);
}

arguments

arguments对象代表正在执行的函数和调用它的函数的参数。

//通过例子很好说明
function printArguments()
{
	for(arg in arguments)
	{
		arguments[arg].description();
	}
}
printArguments(1,"yes",[1,2,3,4]);
//输出:
//[Number: 1]
//[String: 'yes']
//[ 1, 2, 3, 4 ]
//[Function]  //这个可以忽视,这个是上面添加的description()方法。

caller
返回一个对函数的引用,该函数调用了当前函数。

function f1()
{
	if (f1.caller)
	{
		f1.caller.description();
	}else{
		"this is a top function".description();
	}
}

function f2()
{
	f1();
}
f2();
// 打印结果是:[Function: f2]

callee
callee 属性的初始值就是正被执行的 Function 对象。
callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名
函数的递归或者保证函数的封装性

// 打印函数本身
function func()
{
	arguments.callee.description()
}
func();   // [Function: func]

// 可以用于验证形参和实参
function calleeDemo(arg1,arg2)
{
	arguments.length.description();         //arguments.length是实参长度
	arguments.callee.length.description();  //arguments.callee.length是形参长度
}
calleeDemo(1);        // [Number: 0]  [Number: 2]
calleeDemo(1,2);      // [Number: 2]  [Number: 2]
calleeDemo(1,2,3);    // [Number: 3]  [Number: 2]

// 用于递归  1+2+3+....
var sum = (function(n){
	return n <= 0 ? 0 : (n + arguments.callee(n-1));
})(100);
sum.description();  // [Number: 5050]

apply 和 call
它们的作用都是将函数绑定到另外一个对象上去运行。两者仅在定义参数方式有所区别。
apply(thisArg,argArray);

call(thisArg,arg1,arg2…);
也可以说它们将函数对象的上下文从初始的上下文改变为由thisArg指定的新对象。

// 了解一下
function sayHi()
{
	("Hello, "+ this.name + ".").description();
}
var person = {
	name : "张三丰"
};
sayHi.call(person);//[String: 'Hello, 张三丰.']


//应用call和apply还有一个技巧在里面,就是用call和apply应用另一个函数(类)以后,
//当前的函数(类)就具备了另一个函数(类)的方法或者是属性,这也可以称之为“继承”。
function base(){
	this.name = "奥特曼";
	this.method = function(){
		this.name.description();
	}
}

function extend()
{
	base.call(this);
	name.description();
	method.description();//[Function]
}

extend();
// 打印: //[String: '奥特曼'] //[Function]
(new extend()).method();
// 打印: //[String: '奥特曼'] //[Function] // [String: '我是奥特曼.']

/**
*上面的例子可以看出,通过call之后,extend可以继承到base的方法和属性。 
**/

你可能感兴趣的:(js,ES,javascript,call,callee,JavaScript)