我已经知道 apply
和 call
是类似的函数,它们设置 this
(函数的上下文) .
不同之处在于我们发送参数的方式(手动与数组)
Question:
但什么时候应该使用 bind()
方法?
var obj = {
x: 81,
getX: function() {
return this.x;
}
};
alert(obj.getX.bind(obj)());
alert(obj.getX.call(obj));
alert(obj.getX.apply(obj));
16 回答
Call调用该函数并允许您逐个传入参数 .
Apply调用该函数并允许您将参数作为数组传递 .
Bind返回一个新函数,允许你传入一个这个数组和任意数量的参数 .
应用与呼叫与绑定示例
Call
Apply
Bind
何时使用每个
通话和申请是可以互换的 . 只需确定发送数组或逗号分隔的参数列表是否更容易 .
我总是记得哪一个是通过记住Call是逗号(分隔列表)而Apply是for Array .
绑定有点不同 . 它返回一个新函数 . Call和Apply立即执行当前功能 .
Bind非常适合很多事情 . 我们可以使用它来调整上面例子中的函数 . 我们可以使用一个简单的hello函数并将其转换为helloJon或helloKelly . 我们也可以将它用于像onClick这样的事件,我们不知道什么时候它们会被解雇,但我们知道我们希望它们有什么背景 .
Referance:codeplanet.io
当我们想要为具有特定上下文的函数分配例如时,应该使用绑定函数 .
在上面的例子中,如果我们调用demo.setValue()函数并直接传递this.getValue函数,那么它不会直接调用demo.setValue函数,因为这在setTimeout中引用了window对象,所以我们需要将demo对象上下文传递给this.getValue使用bind的函数 . 它意味着我们只传递函数与demo对象的上下文而不是实际调用函数 .
希望你明白 .
欲了解更多信息,请参阅javascript bind function know in detail
它们都将 this 附加到函数(或对象)中,区别在于函数调用(见下文) .
call 将 this 附加到函数中并立即执行该函数:
bind 将 this 附加到函数中,它需要像这样单独调用:
或者像这样:
apply 类似于 call ,除了它采用类似数组的对象而不是一次列出一个参数:
Call apply and bind. and how they are different.
让我们学习电话并使用任何日常术语进行申请 .
你有三辆汽车
your_scooter , your_car and your_jet
,它们以相同的机制(方法)开始 . 我们使用方法push_button_engineStart
创建了一个对象automobile
.让我们了解什么时候打电话和申请使用 . 让我们假设你是一名工程师,你有
your_scooter
,your_car
和your_jet
,它没有附带push_button_engine_start,你希望使用第三方push_button_engineStart
.如果运行以下代码行,则会出错 . 为什么?
因此,上面的示例成功地为your_scooter,your_car,your_jet提供了来自汽车对象的功能 .
Let's dive deeper 这里我们将拆分上面的代码行 .
automobile.push_button_engineStart
帮助我们获得所使用的方法 .此外,我们使用点符号应用或调用 .
automobile.push_button_engineStart.apply()
现在应用并调用accept两个参数 .
上下文
参数
所以这里我们在最后一行代码中设置上下文 .
automobile.push_button_engineStart.apply(your_scooter,[20])
Difference between call and apply 只是应用接受数组形式的参数,而调用只是可以接受逗号分隔的参数列表 .
what is JS Bind function?
绑定函数基本上绑定某事物的上下文,然后将其存储到变量中以便在稍后阶段执行 .
让我们前面的例子更好 . 之前我们使用了属于汽车对象的方法并用它来装备
your_car, your_jet and your_scooter
. 现在让我们想象一下,我们想单独给出一个单独的push_button_engineStart
,以便在我们希望执行的任何后期阶段单独启动我们的汽车 .still not satisfied?
让我们把它说成泪滴 . 是时候试验了 . 我们将返回调用并应用函数应用程序并尝试存储函数的值作为参考 .
下面的实验失败,因为调用和apply立即被调用,因此,我们永远不会进入将变量存储在变量中的阶段,这是绑定函数窃取节目的地方
var test_function = automobile.push_button_engineStart.apply(your_scooter);
想象一下,绑定不可用 . 你可以很容易地构建它如下:
call/apply 立即执行功能:
bind 不立即执行函数,但返回包装的apply函数(以便以后执行):
Call调用该函数并允许您逐个传入参数 .
Apply调用该函数并允许您将参数作为数组传递 .
Bind返回一个新函数,允许你传入一个这个数组和任意数量的数组参数 .
这里有一个good article来说明
bind()
,apply()
和call()
之间的区别,总结如下 .bind()
允许我们在调用函数或方法时轻松设置将绑定到哪个特定对象 .bind()
允许我们借用方法这个例子的一个问题是我们在
cars
对象上添加了一个新方法showData
,我们可能不想这样做只是为了借用一个方法,因为cars对象可能已经有一个属性或方法名称showData
. 我们不想意外覆盖它 . 我们将在下面对Apply
和Call
的讨论中看到,最好使用Apply
或Call
方法借用一个方法 .bind()
允许我们讨论一个函数Function Currying,也称为部分函数应用程序,是使用一个函数(接受一个或多个参数),该函数返回一个已经设置了一些参数的新函数 .
我们可以使用
bind()
来讨论这个greet
函数apply()
或call()
设置此值apply
,call
和bind
方法都用于在调用方法时设置此值,并且它们以稍微不同的方式执行,以允许在JavaScript代码中使用直接控制和多功能性 .设置此值时,
apply
和call
方法几乎完全相同,只是将函数参数作为数组传递给apply ()
,而必须单独列出参数以将它们传递给call ()
方法 .下面是一个使用
call
或apply
在回调函数中设置它的示例 .使用
apply
或call
借用函数借用数组方法
让我们创建一个
array-like
对象并借用一些数组方法来操作类似数组的对象 .另一种常见情况是将
arguments
转换为数组如下apply()
执行变量功能Math.max是变量函数的一个例子,
但是,如果我们有一组数字传递给
Math.max
怎么办?我们不能这样做:这是
apply ()
方法帮助我们执行可变参数函数的地方 . 而不是上述,我们必须使用apply (
)传递数字数组,因此:它允许设置
this
的值,与函数的调用方式无关 . 这在使用回调时非常有用:使用
call
获得相同的结果将如下所示:假设我们有
multiplication
功能让我们使用
bind
创建一些标准函数var multiby2 = multiplication.bind(this,2);
现在multiby2(b)等于乘法(2,b);
如果我在bind中传递两个参数怎么办?
现在getSixAlways()等于乘法(3,2);
甚至传递参数返回6;
getSixAlways(12); //6
这将创建一个新的乘法函数并将其分配给magicMultiplication .
哦不,我们将乘法功能隐藏在magicMultiplication中 .
调用
magicMultiplication
返回空白function b()
在执行它工作正常
magicMultiplication(6,5); //30
打电话和申请怎么样?
magicMultiplication.call(this,3,2); //6
magicMultiplication.apply(this,[5,2]); //10
简单来说,
bind
创建函数,call
和apply
执行函数,而apply
期望数组中的参数如果希望稍后使用特定上下文调用该函数,请使用
.bind()
,这在事件中很有用 . 如果要立即调用该函数,请使用.call()
或.apply()
,然后修改上下文 .调用/应用立即调用该函数,而
bind
返回一个函数,该函数在稍后执行时将具有用于调用原始函数的正确上下文集 . 这样,您可以在异步回调和事件中维护上下文 .我做了很多:
我在Node.js中广泛使用它来进行异步回调,我想传递一个成员方法,但仍希望上下文成为启动异步操作的实例 .
一个简单,天真的bind实现就像:
它还有更多内容(比如传递其他args),但是你可以阅读更多关于它的信息并查看真正的实现on the MDN .
希望这可以帮助 .
Function.prototype.call()和Function.prototype.apply()都调用具有给定
this
值的函数,并返回该函数的返回值 .另一方面,Function.prototype.bind()创建一个具有给定
this
值的新函数,并返回该函数而不执行它 .那么,让我们看一个如下所示的函数:
现在,让我们看一个看起来像这样的对象:
我们可以将函数绑定到我们的对象,如下所示:
现在,我们可以在代码中的任何位置运行
Obj.log
:它真正变得有趣的地方是,当你不仅为
this
绑定一个值,而且为它的参数绑定prop
:我们现在可以这样做:
bind :它使用提供的值和上下文绑定函数,但它不执行该函数 . 要执行功能,您需要调用该函数 .
call :它使用提供的上下文和参数执行函数 .
apply :它使用提供的上下文和 parameter as array 执行函数 .
我认为它们的相同之处是:它们都可以改变函数的这个值 . 它们的区别在于:bind函数将返回一个新函数作为结果; call和apply方法会立即执行该函数,但apply可以接受一个数组作为params,它会解析分离的数组 . 而且,bind函数可以是Currying .