调用应用和绑定。以及它们有何不同。
让我们学习使用任何日常术语的呼叫和应用。
你有三辆汽车your_scooter , your_car and your_jet
,它们以相同的机制(方法)开始。automobile
我们用一个方法创建了一个对象push_button_engineStart
。
var your_scooter, your_car, your_jet;
var automobile = {
push_button_engineStart: function (runtime){
console.log(this.name + "'s" + ' engine_started, buckle up for the ride for ' + runtime + " minutes");
}
}
让我们了解何时调用和应用。让我们假设您是一名工程师并且您有your_scooter
,your_car
并且your_jet
没有附带 push_button_engine_start,并且您希望使用第三方push_button_engineStart
。
如果您运行以下代码行,它们将给出错误。为什么?
//your_scooter.push_button_engineStart();
//your_car.push_button_engineStart();
//your_jet.push_button_engineStart();
automobile.push_button_engineStart.apply(your_scooter,[20]);
automobile.push_button_engineStart.call(your_jet,10);
automobile.push_button_engineStart.call(your_car,40);
所以上面的例子成功地给 your_scooter, your_car, your_jet 一个来自汽车对象的特征。
让我们深入研究
这里我们将拆分上面的代码行。
automobile.push_button_engineStart
正在帮助我们获得正在使用的方法。
此外,我们使用点符号来应用或调用。
automobile.push_button_engineStart.apply()
现在应用并调用accept两个参数。
- 语境
- 论据
所以这里我们在最后一行代码中设置上下文。
automobile.push_button_engineStart.apply(your_scooter,[20])
call 和 apply 之间的区别只是 apply 接受数组形式的参数,而 call 只接受逗号分隔的参数列表。
什么是 JS 绑定功能?
绑定函数基本上是绑定某物的上下文,然后将其存储到变量中以供稍后执行。
让我们把前面的例子做得更好。前面我们使用了一个属于汽车对象的方法,并用它来装备your_car, your_jet and your_scooter
。现在让我们想象一下,我们希望push_button_engineStart
在执行的任何后期阶段分别单独启动我们的汽车。
var scooty_engineStart = automobile.push_button_engineStart.bind(your_scooter);
var car_engineStart = automobile.push_button_engineStart.bind(your_car);
var jet_engineStart = automobile.push_button_engineStart.bind(your_jet);
setTimeout(scooty_engineStart,5000,30);
setTimeout(car_engineStart,10000,40);
setTimeout(jet_engineStart,15000,5);
还不满意?
让我们像泪珠一样清楚。是时候做实验了。我们将返回调用并应用函数应用程序,并尝试将函数的值存储为引用。
下面的实验失败了,因为 call 和 apply 是立即调用的,因此,我们永远不会到将引用存储在变量中的阶段,而这正是 bind 函数抢镜的地方
var test_function = automobile.push_button_engineStart.apply(your_scooter);