call方法、apply方法、caller属性和callee属性
2012-07-09 09:51 江苏黑马 阅读(1232) 评论(0) 收藏 举报- call方法。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
举一个具体的例子:
function add(a,b) { alert(a+b); } function sub(a,b) { alert(a-b); } add.call(sub,3,1);
这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
- apply方法。
这两个方法基本上是一个意思
区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组。obj.fun.apply(obj1,arguments) 获得的是obj1(arguments)的调用。也就是说即使obj1不具备该方法,比如 Array.slice.apply(obj1,argument) 中,obj1不具备array类才有的slice(分割字符串)方法,但是这里可以让他得到这个方法 - caller属性。指用本函数的调用语句所在的作用域的创建函数,仅在函数在另一个函数内被调用时有效,若函数在顶级作用域内被调用,有:caller==null (注意:这里的调用是指一个函数在另一个函数内被调用,强调的是函数运行的位置,而非函数被哪个对象所调用)
function a(){ alert(a.caller); } function b(){ a(); } b(); // a函数弹出function b(){ a(); } a(); //a函数弹出 null
- callee属性。arguments.callee 指向函数自身,因此函数递归可以这样写:
function c(){ arguments.callee(); }
看如下callee实例:
function getOffset(elem){ if(typeof arguments.callee.offset=="number"){ } }
arguments.callee表示函数自身也就是getOffset;
arguments.callee.offset则是表示offset是getOffset的属性,因为在javascript中函数也是对象,可以有属性和方法。这句话的意思就是获取函数getOffset的offset值。
function.caller 和arguments.callee是只读的,不能通过修改这个属性来改变函数自身。