简说 call() 、apply() 、bind()
对于这三个方法,我想一部分人还是比较陌生的。
所以今天来个简单的介绍~
我们可以将call()和apply()看作是某个对象的方法,通过调用方法的形式来间接调用函数。call()和apply()的第一个实参是要调用函数的母对象,在函数体内通过this来获得他的引用。
简单例子:
function test(){ return this.x + this.y; } var o = {x:1,y:2}; console.log(test.call(o)); console.log(test.apply(o));
对于call()来说,第一个调用上下文实参之后的所有实参就是要传入待调用函数的值。
对于apply()来说,它的实参都放入一个数组当中。
例:
function test(x,y){ return x + y; } console.log(test.call(this,1,2)); console.log(test.apply(this,[2,3]));
我想经过这两个例子,对于call()和apply()这两个方法,应该有个简单的理解了吧。
bind():主要作用就是将函数绑定至某个对象。如下例所示,当在函数f()上调用bind()方法并传入一个对象o作为参数,这个方法将返回一个新的函数。 调用新的函数将会把原始的函数f()当做o的方法来调用。传入新函数的任何实参都将传入原始函数
function f(y){return this.x+y} var o = {x:1}; var g = f.bind(o); g(2) // =>3
在ECMAScript 5中的bind()方法不仅仅是将函数绑定至某一个对象,它还附带一些其他作用:除了第一个实参之外,传入bind()的实参也会绑定至this,这个附带的应用是一种常见的函数式编程技术,有时也被称为"柯里化"(哇塞,柯里化,听起来很高大上的赶脚~)
var sum = function(x,y){return x + y}; //返回两个实参的和值 //创建一个类似sum的新函数,但this的值绑定到null //并且第一个参数绑定到1,这个新的函数期望只传入一个实参 var succ = sum.bind(null,1); succ(2) //=>3 :x绑定到1,并传入2作为实参y function f(y,z){return this.x + y +z}; //另外一个做累加计算的函数 var g = f.bind({x:1},2); g(3) // = >6: this.x绑定到1,y绑定到2,z绑定到3
OK 就先介绍到这里~