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,否则返回调用函数的toStringfunction 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,这可实现将函数作为另外一个对象的方法运行的目的
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
如果 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
<完>