函数的arguments,caller,callee,call,apply

1.arguments

arguments是一个特殊的函数内部对象实例,不是数组,但是长的很像数组。可以通过arguments[x]来访问变量,实际传入的参数从左到右依次为 arguments[0]...

//arguments.length和functionName.length
function argumentTest(arg1, arg2)
{
	//arguments的长度是变化的,实际传进几个参数就是几个。
	console.log(arguments.length)
	
	//函数名.length代表函数定义时参数的个数,一旦函数定义,该值就固定了。
	console.log(argumentTest.length) 
}

argumentTest(1,2,3,4);//定义时参数有两个,则argumentTest.length = 2, 实际传入参数为4个,则arguments.length = 4

2.arguments.callee

返回正在执行的函数, 由于arguments是自身函数才能使用,arguments.callee则始终返回自身函数。

另外当函数为匿名函数式,递归调用时,用arguments.callee更清晰一些。

上面提到functionName.length代表实参的长度,但是匿名函数的实参长度无法取,用arguments.callee.length即可取得实参的长度

var sum = function(n)
{	
	if( n == 1)
	{
		return 1;
	}
	else
	{
		//等价于 n + sum(n-1),但是这个使用的是自身而不是外部变量sum,递归更明显
		return n + arguments.callee(n-1); 
	}
}

function calleeTest(n)
{	
	if( n == 1)
	{
		return 1;
	}
	else
	{
		return n + arguments.callee(n-1); //等价于 n + calleeTest(n-1)
	}
}
alert(calleeTest(10)) //55

3.funcitonName.caller

caller是返回该函数被谁调用,如果处于顶层,则返回null,否则返回调用函数的toString
function callerTest()
{	
	console.log(callerTest.caller)
}

callerTest(); //这个调用是全局的,即属于顶层window,则caller是null

(function (){
	callerTest()
})() //这里callerTest被匿名立即执行函数调用,caller返回该匿名函数的toString,即函数实现体。

4.apply and call

它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别:
    Other.apply(thisArg,argArray);
    Other.call(thisArg[,arg1,arg2…] ]); // 将other函数绑定到this上执行
即所有函数内部的this指针都会被赋值为thisArg,这可实现将函数作为另外一个对象的方法运行的目的

apply的说明
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisArg任何一个参数,那么 Global 对象将被用作 thisArg, 
并且无法被传递任何参数。
call的说明
call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisArg指定的新对象。
如果没有提供 thisArg参数,那么 Global 对象被用作 thisArg
var name = "this is the global:window"
var player = {name:"player", health:200}
var enemy = {name:"enemy", health:100}


function getName()
{
<span style="white-space:pre">	</span>console.log(this.name);
}


getName();//默认情况下函数的第一个参数this,输出window.name值
getName.call(player); //this切换为payer.name
getName.call(enemy); //切换为enemy.name

用此特性,可以实现对象的继承
function Character(name, health)
{
	this.name = name;
	this.health = health;
	
	this.getName = function(){return this.name}
}

function Player()
{
	Character.call(this, "player", 200); //将Chracter构造函数在Player中执行
}

function Enemy()
{
	Character.apply(this, ["enemy", 100]); //apply方法
}

var player = new Player();
var enemy = new Enemy();

console.log(player.getName())//player
console.log(enemy.getName()) //enemy

<完>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值