同样在开始前为了方便打印,添加一个函数
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的方法和属性。
**/