call apply bind作用类似。即调用一个对象的一个方法,以另一个对象替换当前对象。
call
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
apply
语法:apply([thisObj[,argArray]])
bind
call() apply() 都是立马就调用了对应的函数,而 bind() 不会, bind() 会生成一个新的函数,bind() 函数的参数跟 call() 一致,第一个参数也是绑定对象,后面接受传递给函数的不定参数。 bind() 生成的新函数返回后,想什么时候调就什么时候调,实例如下:
var m = {
"x": 1
};
function foo(y) {
alert(this.x + y);
}
foo.apply(m, [5]);
foo.call(m, 5);
var foo1 = foo.bind(m, 5);
foo1();
Bind方法不仅将函数绑定至一个对象,它还附带一些其他应用:除了第一个参数之外,出入bind的实参也会绑定到调用对象上,这个附带应用是一种常见的函数式编程技术,有时也称为“柯里化”,实例如下:
var sum = function (x, y) {
return x+y
}
//创建一个类似sum新函数,并且第一个参数绑定到1
var succ = sum.bind(null, 1);
//结果为3:x绑定到1,并传入2作为实参y
succ(2)
caller
在一个函数调用另一个函数时,被调用函数会自动生成一个caller属性,指向调用它的函数对象。如果该函数当前未被调用,或并非被其他函数调用,则caller为null。
callee
当函数被调用时,它的arguments.callee对象就会指向自身,也就是一个对自己的引用。
由于arguments在函数被调用时才有效,因此arguments.callee在函数未调用时是不存在的(即null.callee),且引用它会产生异常。
arguments: 在函数调用时, 会自动在该函数内部生成一个名为 arguments的隐藏对象。 该对象类似于数组, 但又不是数组,而是Object对象。可以使用[]获取函数调用时传递的实参。