call,apply,bind的联系与区别

xiaoxiao2021-02-28  96

call,apply 的相同点

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/ 作者讲的很好,也推荐大家去看

转载请注明原文地址: https://www.6miu.com/read-43053.html

最新回复(0)