A.call(B) A.apply(B) 把 A 的方法放在 B 上面执行。
比如:apply(代表上文的A) 对象有一个方法 say(), 但是如果我们有一个对象banana(代表上文的B)= {color : “yellow”} ,我们不想对它重新定义 say 方法,那么我们可以通过 call 或 apply 用 apple 的 say 方法:
function fruits() {} fruits.prototype = { color: "red", say: function() { console.log("My color is " + this.color); } } var apple = new fruits; apple.say();A.call(B) 即 apple.say.call(banana).apple 的say 方法放在对象 banana 上面执行
banana = { color: "yellow" } apple.say.call(banana); //My color is yellow apple.say.apply(banana); //My color is yellow call,apply 的不同点接受参数的方式不同 call: 把参数按顺序传递进去 apply: 把参数放在数组里 所以,参数不确定的时候,使用 apply ,把参数 push 进去。或者通过 arguments 伪数组传递
如:函数定义如下
var func = function(arg1, arg2) {};通过 call,apply 传递方式如下:
func.call(this, arg1, arg2); func.apply(this, [arg1, arg2]) bind 方法 var bar = function() { console.log(this.x); } var foo = {x:3}; bar.bind(foo); 三者的联系与区别 call,apply 立即执行 bind 并非立即执行,而是一个回调看一个例子
var obj = {x:81}; var foo = { getX: function() { return this.x; } } foo.getX.call(obj); foo.getX.apply(obj); foo.getX.bind(obj)();//注意:多了一个()总结:
三者都用于改变函数内部的 this 指向 第一个参数必须是 this 要指向的对象 三者都可利用后续参数传参 bind 返回对应函数,便于稍后调用,apply,call 是立即使用
本文参考了 http://web.jobbole.com/83642/ 作者讲的很好,也推荐大家去看