在一些简单的Javascript操作中,调用和应用函数很少使用。在其他一些更大的业务,如Web应用的发展,这两个功能往往可以在JS框架的发展遇到的问题。在这两个功能,网上的资料很多,但我认为很多信息或高度相似,或照本宣科,到地球解释的缺乏。然后我试图分析和解释更清楚、更简单的方式这两个功能。

复制代码代码如下所示:

我们可以打电话叫()和运用()作为一个对象的方法和调用函数的调用方法实现间接呼叫第一真实的说法()和()将要调用的函数的父对象,并调用上下文,和它的参考是通过这一功能获得。调用函数f()的对象的方法,你可以使用电话()和运用():f.call(O)f.apply(O)。{ 1 }



让我们先分析一下电话。这里是ECMAscript第三版通话的功能解释。{ 2 }:当调用的方法是通过一个函数对象调用(func.call(0)),确有必要进口的必要参数和一些非必要的参数,它的执行是这样的。

一,如果对象被称为是不运行,抛出TypeError错误。

B,将参数列表设置为空

C,如果调用的方法是在一个以上的参数,通过arg1,arg2,依次插入参数列表。

d返回调用调用的结果,用传入参数1替换调用函数中的这个函数,并将参数列表作为函数的参数。

事实上,调用函数是函数对象的原型,也就是说,当调用调用函数时,它也必须是一个函数。调用调用时,函数调用调用中的这个函数由传入对象替换。



函数C1(){
这名=;
这个年龄的印象;
这个sayname =函数(){
console.log(这是C1班,我的名字是:+姓名+我这个年龄+这个年龄);
}
}
函数C2(){
这名李四;
这年龄=州;
}
新C1();
新C2();
c1.sayname();
c1.sayname.call(C2);




实施结果:

这里是C1类,我的名字是:张三,我的年龄是24岁。

这里是C1班,我的名字是:Li Siwo的年龄是25岁

在上面的代码中,声明了两个班,C1和C2,C1有两个属性,一个方法,也有两C1和C2相同的属性,实例化之后,(C1。sayname)打印出的实际性能,c1.sayname.call(C2)印刷除了C2的属性,这是为什么呢因为sayname()是一个函数,并且函数有一个这样的身体,打电话的时候被执行,这是由C2所取代,所以它最终将打印的C2的属性。

应用程序和调用之间的区别在于可选参数的传递。应用程序的可选参数都存储在数组中。作为参数,调用被划分为多个参数。

那么,应用程序和调用函数的应用程序是什么呢第一个是在数字网络上的阵列中找到最重要的元素,并使用math.max.apply(null,阵列),而另一个可以通过申请和调用继承。



功能人(姓名,性别){
这个名字=名字;
这是性=性;
这一步=函数(){
console.log(我走);
}
}
函数子(){
Human.call(这一点,肖明
这个玩=函数(){
console.log(我喜欢玩非常');
}
这个介绍=函数(){
console.log(你好,我的名字+本。);
}
}
无功jinp =新人类(杰克','男');
var小平=新子();
Xiaoping.walk();
Xiaoping.paly();
Xiaoping.intruduce();





实施结果:

我走

我非常喜欢玩。

你好,我是肖明

类似的一个函数调用()和()的结合应用是(),这是在ECMAscript 5的一种新方法,但可以模拟绑定()在ECMAscript 3。绑定功能也是一个function.prototype Javascript方法,这种方法的主要内容是绑定的函数对象。当函数f()绑定到绑定()方法,通过为一个对象作为参数,该方法将为O.进入了新功能的任何参数将被传递到原函数方法返回一个新的函数,如下:



功能介绍(国家,爱好){
返回你好,我叫+这个名字+
}
肖明
VaR介绍= introduce.bind(Xiaoming);
console.log(Jieshao(中国





实施结果:

你好,我叫肖明。我20岁。我是中国人。我喜欢打球。

上述示例相当于:



功能介绍(国家,爱好){
返回你好,我叫+这个名字+
}
肖明
console.log(introduce.apply(小明,{中国
或以下
console.log(introduce.call(小明,中国





应该指出的是,在ECMAscript 5严格模式,调用的第一个参数()和()的应用将成为这个价值,即使传入的参数的初始值,即使是空的或不确定的。在ECMAscript 3和非严格模式,输入无效的定义将由全球代替,而其他的原始值将被相应的包装物取代。

参考材料

{ 1 },Javascript权威指南第六版,189页

{ 2 },function.prototype.call(thisarg { {,arg1,arg2,…} })

{ 3 }、Function.prototype.apply(thisarg,argarray)