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

本文介绍了JavaScript中的几个关键概念:arguments对象用于存储函数参数,caller属性返回调用当前函数的对象,callee属性指向当前执行的函数本身,常用于匿名函数的递归。此外,还讲解了call和apply方法,它们可以改变函数执行的上下文,实现函数绑定,主要区别在于传递参数的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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的方法和属性。 
**/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值