1 call,apply,bind都是Function里面原生支持的方法,是JavaScript引擎内在实现的,每个Function的实例都有这三个属性。
call() 和 apply() 的用法很相似,只是调用的时候传递参数的方式有些区别:
call():function.call(object, arg1,arg2...),
apply():function.apply(object, [arg1,arg2,...]),apply方法传递的是一个参数数组,所以有时候直接传个 arguments 就可以。
注:这里的object就是该function里面的this,这也是js一个神奇的地方,可以随意修改一个方法的this。
2 bind 跟call,apply的区别是:call,apply都是立刻执行的,不能用于函数申明或绑定事件里面。
比如说 dom.onclick = function.apply(object, [......]) 这种方式是要报错的。解决的办法就是使用 bind,bind的用法:
dom.onclick = function.bind(object)。因为bind返回的是一个函数引用,所以只需要传递一个function调用时,绑定的对象即可,不再传递该函数调用时 需要的实参。
3 caller 和 callee
(1)caller 返回的是一个调用了该函数的函数,即是一个函数的引用。caller属性只有在函数执行时才有定义。function callerDemo() {if ( callerDemo.caller) {var a= callerDemo.caller.toString();console.log(a);} else {console.log("this is a top function");}}function handleCaller() {callerDemo();}callerDemo(); // 输出的是handleCaller这个函数的引用
(2)callee 返回正在被执行的函数对象,调用方法:[function.]arguments.callee,该属性经常被用于递归。需要注意的是callee拥有length属性,这个属性有时候用于验证还是比较好的。 arguments.length是实参长度,arguments.callee.length是形参长度,由此可以判断调用时形参长度是否和实参长度一致。
var sum = function(n){if(n <= 0){return 1;}else{return n + arguments.callee(n - 1);// return n + sum(n - 1);}}