Javascript中调用、应用和绑定方法的详细解决方案和总结

Javascript中调用、应用和绑定方法的详细解决方案和总结
以下内容分为以下几节:

1的来源。

2.function.prototype.call()

3.function.prototype.apply()

3.1:找到数组中的最大数

3.2:将数组的空元素更改为未定义的

3.3:用类似的数组转换对象

4.function.prototype.bind()

5。绑定到回调函数的对象

这两者之间的联系和区别6.call,申请,并绑定方法

1的来源。

首先,当使用调用、应用和绑定方法时,必须知道这三种方法是从何而来的。为什么我们可以使用这三种方法呢

三种方法,如电话,申请,并绑定,实际上是继承了function.prototype,属于一个实例方法。
console.log(function.prototype.hasownproperty(认购)) / /真的
console.log(function.prototype.hasownproperty('apply ')) / /真的
console.log(function.prototype.hasownproperty('bind ')) / /真的
上面的代码返回true,表示这三种方法是从function.prototype.of当然继承了普通对象、函数和数组function.prototype对象继承的三种方法,所以这三个方法可以用于对象、数组和函数。

继承的概念将在将来与您共享。

2.function.prototype.call()

函数实例的调用方法可以在函数中指定该函数的方向,即函数执行的范围,然后在指定的范围内调用函数,该函数将立即执行。

看一个例子来充分理解这一点。
var基思{ {
流氓:123
};
var = 456;
函数A(){
console.log(这个坏蛋);
}
A();456
a.call(); / / 456
a.call(空); / / 456
a.call(定义); / / 456
a.call(本); / / 456
a.call(基思); / / 123
在上面的代码中,该关键字的功能,如果指向全局对象,返回结果456。你可以看到,如果调用方法没有参数,或者参数无效或未定义或本,它相当于指向全局对象。如果调用方法用于点此关键字基思对象,即范围的函数时,函数的执行是基思的对象,结果是123。

调用()方法可以传递两个参数,第一个参数是在函数中指定这个方向(即函数执行的范围),第二个参数是函数调用时要传递的参数。
函数基思(a,b){
console.log(A + B);
}
keith.call(null,1, 2); / / 3
第一个参数是必需的,它可以是空的,未定义的,但是不能是空的。设置为null,未定义,这表明函数基思现在在全局范围内。每个第二个参数必须一个一个地添加。

调用方法的一个应用是调用对象的本地方法,它也可以用来将数组对象转换成数组。
var obj = { };
console.log(obj.hasownproperty('tostring ')); / /假
obj.hasownproperty =函数(){
返回true;
}
console.log(obj.hasownproperty('tostring ')); / /真的
console.log(object.prototype.hasownproperty.call(obj,'tostring ')); / /假
在上面的代码中,hasownproperty是obj对象继承的方法,如果该方法被覆盖,它不会得到正确的结果,调用的方法可以解决这个方法。它执行hasownproperty方法的原始定义的目标对象,所以,无论是否有相同的对象名称的方法,它不会影响结果。需要注意的是,hasownproperty是object.prototype本地对象的方法重要,电话是一种继承function.prototype。

3.function.prototype.apply()

应用程序方法的功能类似于调用方法。它也改变了这个(函数执行的)的方向,然后在指定的范围内调用函数。函数将同时执行。唯一的区别是当函数执行时它接收一个数组作为参数。

的应用方法的第一个参数是指向的对象,如果它被设置为null或未定义或本,它相当于指定的全局对象。二参数是一个数组,该数组的所有成员都将作为参数,在调用的时候了原函数,原函数的参数必须加上一个接一个的调用方法,但在运用的方法,它必须以数组的形式添加。

看电话和申请之间的细微差别。
函数基思(a,b){
console.log(A + B);
}
keith.call(null,2, 3); / / 5
Keith.apply(null,{ 2, 3 }); / / 5

在上面的代码中,第一个参数为null,指向全局作用域;第二个参数以略微不同的形式简要介绍

应用方法有以下应用。

3.1:找到数组中的最大数
var = { 2, 4, 5,7, 8, 10 };
Console.log (Math.max.apply (null, a)); //10
console.log(math.max.call(null,2, 4, 5,7, 8, 10)); / / 10
在Javascript中,没有办法找出数组中的最大值。联合应用math.max继承function.prototype,您可以返回数组的最大值。

3.2:将数组的空元素更改为未定义的

使用应用程序方法,使用数组构造函数将数组的空元素变为未定义。

console.log(Array.apply(null,{ 1, 3 })); / / { 1,3 },

空元素和定义之间的区别在于,数组的foreach方法跳过空单元,但不跳过未定义的和无效的。因此,当遍历内部元素,不同的结果。
var = { 1, 3 };
a.foreach(函数(指数){)
console.log(指数); / / 1,3,跳过空单元。
})
Array.apply(null,A)。ForEach(函数(指数){)
console.log(指数); / / / / 1,定义,3,设置为未定义的空元素
})
3.3:用类似的数组转换对象

此外,使用数组对象的切片方法,像数组这样的对象(例如一个参数对象)可以转换成一个真正的数组。当然,切片方法最重要的应用之一是将数组之类的对象转换成真正的数组。
console.log(Array.prototype.slice.apply({ 0:1,长度:1 })); / / { 1 }
console.log(array.prototype.slice.call({ 0:1,长度:1 })); / / { 1 }
console.log(Array.prototype.slice.apply({ 0:1,长度:2 })); / / { 1 },定义
console.log(array.prototype.slice.call({ 0:1,长度:2 })); / / { 1 },定义
函数基思(a,b,c){
返回参数;
}
console.log(array.prototype.slice.call(基思(2,3,4))); / / {、}
上述代码的调用、应用方法的参数都是对象,但是返回结果都是数组,它充当对象数组。从上面的代码中可以看到,该方法工作的前提是所处理的对象必须具有长度属性和相应的数字键。

4.function.prototype.bind()

绑定方法用于在函数的函数(执行的作用域)中指定这一点,然后返回一个新函数。
var基思{ {
甲:1,
计数:函数(){
Console.log (this.a++);
}
};
Keith.count(); / / 1
Keith.count(); / / 2
Keith.count(); / / 3
在上面的代码中,如果A指向基思对象中的一个属性,如果方法分配给另一个变量,调用将出错。
var基思{ {
甲:1,
计数:函数(){
(这console.log。+ +);
}
};
var = keith.count;
f();
在上面的代码中,如果计数方法被分配给f变量,那么这个对象不再是基思对象,而是一个窗口对象和窗口。默认是未定义的,在增量操作之后,未定义的++等于。

为了解决这个问题,您可以使用绑定方法将基思对象中的这个对象绑定到基思对象,或者直接调用它。
var = keith.count.bind(基思);
f();1
f();2
f();3
Keith.count.bind(基思)()() / / 1
Keith.count.bind(基思)()() / / 2
Keith.count.bind(基思)()() / / 3
当然,这也可以绑定到其他对象。
var obj = { {
答:100
};
var = keith.count.bind(obj);
f();100
f();101
f();102
类似地,我们可以将参数传递到绑定方法。如果第一个参数为null或未定义或此,函数中的这个对象将指向全局环境。第二个是调用所需的参数,传递参数的形式与调用方法相同。
函数基思(a,b){
返回A+;
}
console.log(keith.apply(null,{二})); / / 5
console.log(keith.call(null,1,4)); / / 5
console.log(keith.bind(null,1, 4)); / /基思()
console.log(keith.bind(null,1, 4))()); / / 5
在上面的代码中,您可以看到调用、应用和绑定三者之间的区别:调用和应用方法都是在调用之后立即执行的。它需要再次调用。这有点像关闭的气味。如果您不熟悉闭包概念,您可以浏览这两篇文章:深入了解Javascript函数参数和闭包,并讨论Javascript的闭包函数。

5。绑定到回调函数的对象

在本文中,这个关键字在Javascript中详细描述,它提到如果这个对象在返回函数中使用,这个对象将指向DOM对象,即按钮对象。
var { { { {
f:函数(){
console.log(= O);
}
}
$(#按钮),(听到咔哒声,函数()){
o.f.apply(O);
/ /或o.f.call(O);
/ /或o.f.bind(O)();
});
单击按钮后,控制台将显示真的,因为应用方法(或调用方法)不仅绑定函数执行的对象,而且立即执行函数,绑定方法也不会立即执行,注意差异,因此我们必须在函数体中编写绑定语句。

这两者之间的联系和区别6.call,申请,并绑定方法

事实上,在函数中指定这个指针的三种方法几乎是相同的,但是只有形式上的不同。读者可以用上面的例子用三种方法来尝试用三种方法来实现它。

总结调用、应用、绑定方法:

答:第一个参数是在函数(函数执行的地方)指定这个方向,然后根据指定的范围调用函数。

B:调用函数时,所有参数都可以传递。调用时,需要直接传递绑定方法,而应用方法需要以数组的形式引入。

调用,应用方法是在调用后立即执行函数,而绑定方法不会立即执行,函数需要再次执行。

d:改变这个对象的方向的问题不仅仅是调用、应用、绑定,还需要变量来确定这个方向。

以上是本文的全部内容,希望本文的内容能给大家的学习或工作带来一定的帮助,同时也希望能给予更多的支持
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部