学习Javascript的调用()、应用()、绑定()和回调

1。调用()、应用()、绑定()方法

在Javascript中,方法是通过调用或应用而不是另一个对象调用的。它改变函数的上下文从初始上下文指定的thisobj新对象。最简单的方法是改变函数的执行上下文,这是最基本的用法,这两种方法之间的基本差异是指的是不同的。

电话(arg1,arg2,OBJ,ARG3);调用的参数的第一个对象,可以为Null参数用逗号分开传输,且参数可以是任何类型。

应用(obj,{ arg1,arg2,ARG3 });应用是通过对象的第一个参数,该参数可以是一个数组或一个参数对象。

1。语法

首先看看JS手册中对调用的解释:

呼叫的方法

调用对象的一种方法用于用另一个对象替换当前对象。

电话(thisobj { { { {,arg1,arg2,{,argn }}}}}。)

参数

thisobj是可选的。它将作为当前对象的对象。

arg1,arg2,,参数是可选的。方法的参数顺序将通过。

解释

调用方法可以用来代替另一个对象调用方法时,调用的方法可以改变一个函数对象上下文从初始上下文的thisobj指定新的对象。

如果没有提供thisobj参数,则全局对象作为thisobj。

其思想是改变对象的内部指针,也就是改变对象的内容,这在JS的面向对象编程过程中有时是有用的。

2。使用

因为函数也是一个对象,每个功能包含两个非继承的方法:采用()和()调用,使用这两种方法的调用是在特定范围的功能,这实际上等于设定的这一目标函数的值。首先,应用()方法接收两个参数:一个是运行功能和其他参数的数组的范围。其中,第二个参数可以是数组或一个参数对象的一个实例。例如:


函数sum(num1,num2){
返回num1 + num2;
}
功能callsum1(num1,num2){
返回sum.apply(这个参数); / /传入的参数对象
}
功能callsum2(num1,num2){
返回sum.apply(,{ num1,num2 }); / /传入数组
}
警报(callsum1(10,10)); / / 20
警报(callsum2(10,10)); / / 20



在上面的例子中,callsum1()介绍到这个值时,执行和()函数,因为它是在全球范围内调用,所以输入的对象是窗口对象和参数object.callsum2也称总和()函数,但它提出了与一系列的参数。这两个函数的执行通常情况下,返回正确的结果。

在严格的模式下,这个值不会被转换为窗口而不指定环境对象和调用函数。除非你显式地将某个函数添加到某个对象或调用应用()或调用(),否则这个值将是未定义的。

3,不同点

电话()方法为采用相同的()方法,和他们的差异仅是其中的参数接受的方式。对于调用()方法,第一个参数是该值没有变化,变化的是,其余的参数直接传递给函数换句话说,当调用()方法,传入函数的参数必须一一列举,如下面的示例所示。


函数sum(num1,num2){
返回num1 + num2;
}
功能callsum(num1,num2){
返回sum.call(这,num1,num2);
}
警报(callsum(10,10)); / / 20



在使用电话的情况下()方法,callsum()必须显式传递到每个参数。没有什么区别,结果和使用适用于()。至于运用()或叫(),它完全取决于你怎么把参数传递给函数最方便的。如果你打算直接进口的争论对象,或阵列,你第一次收到的包裹体的功能,它将使用更加方便适用()。否则,调用()可能更合适。

4。扩展函数运算的范围

实际上,传递参数对应用程序()和调用()不太有用;真正强大的地方是扩展函数的能力。

它运行的作用域。


window.color =红色;
颜色:蓝色};
功能saycolor(){
警戒(这个颜色);
}
SayColor(); / /红色
SayColor.call(本); / /红色
saycolor.call(窗口); / /红色
saycolor.call(O); / /蓝色



这个例子是在该对象上的例子的基础上修改。这一次,saycolor()也被定义为一个全局函数,它会显示红色,当它在全球范围内调用,因为this.color评价将被转换为window.color evaluation.saycolor.call(这)和saycolor.call(窗口)是两种方法显式调用的功能在全球范围内,结果,当然,显示红色的。然而,当运行saycolor.call(O),该函数的执行环境是不同的,因为在这个时候,这个对象的功能点O,所以结果显示蓝色。使用电话最大的优点()()(或申请())扩大行动范围,对象不哈与方法有任何耦合关系。

在前面的例子中的第一个版本,我们先把saycolor()函数为对象,然后调用它通过O,在这种情况下,我们不需要以前的多余的步骤。

5,绑定()方法

然后结合上面提到的()函数的调用(或应用),或()立即调用相应的函数,并绑定(绑定)(不),它会创建一个新的函数绑定()呼叫功能参数(),第一个参数绑定这个值后面的一个不确定的参数传递给功能。通过结合产生新的功能()返回时,当你想调整它,当它调整,


window.color =红色;
颜色:蓝色};
功能saycolor(){
警戒(这个颜色);
}
无功objectsaycolor = saycolor.bind(O);
ObjectSayColor(); / /蓝色



在这里,saycolor()调用绑定(),通过这个客体,创造objectsaycolor()函数,这个值的对象saycolor()函数等于O,所以即使是在全球范围内,你也会看到蓝色的。

浏览器支持绑定()方法包括IE9,Firefox 4 + 5.1 + 12,Safari,Opera和Chrome +。

二、调用()、应用()继承和回调

类的继承

先看看这个例子。




功能人(姓名,年龄){
this.name =名称;
这个年龄=年龄;
this.alertname =函数(){
警报(这个名字);

}
this.alertage =函数(){
警戒(这个年龄);
}
}

功能webdever(姓名,年龄,性别){
person.call(这名字,年龄);
这是性=性;
this.alertsex =函数(){
警戒(这个性别);
}
}

VaR测试=新webdever(四月愚人码头,28,男);

(测试。alertname); / /渔人码头

test.alertage(); / / 28

test.alertsex(男); / /




这类人webdever类的继承,person.call(这名字,年龄)是指用人的构造函数(功能)在这个目标的实现,然后webdever将人的所有属性和方法,测试对象可以直接调用的方法和属性的人

用于回调

调用和应用在回调中的行数也是非常有用的,很多时候我们需要在开发过程中更改回调函数的执行上下文,最常用的,比如ajax或时间的内容,一般来说,ajax是全局的,这是窗口对象,请看这个例子:




功能专辑(ID,标题,owner_id){

this.id = ID;

this.name =标题;

this.owner_id = owner_id;

};

album.prototype.get_owner =函数(回调){

var =;

美元。得到(/业主/+ this.owner_id,功能(数据){ }

回调callback.call(自我、数据。名称);

});

};

新专辑(1,生活,2);

album.get_owner(功能(业主){)

警报(专辑+ this.name +属于+所有者);

});




在这里


Album.get_owner (function (owner) {)

警报(专辑+ this.name +属于+所有者);

});




在专辑中对象的this.name可采取直接在对象的名称属性。

三。回调函数

在回调函数中,很多人都知道它的含义,但他们还是有一点知识。至于如何使用,还是有点困惑。一些互联网上的相关信息不详细说是怎么回事,更one-sided.now我只谈论一个人认识一牛。

定义

回调是什么

看维姬的callback_(computer_programming)进入:

在计算机程序设计中,回调是对某一部分的引用。

在Javascript中,回调函数是指函数作为一个参数(函数参考)传递给另一个函数,这个函数B,B执行函数的A.Let说,函数被称为回调函数。如果没有名字(函数),它被称为一个匿名的回调函数。

例如 uff1a

当你有东西去隔壁卧室找一个学生,却发现人们不在这里时,你会怎么办

方法1,每隔几分钟去隔壁的卧室,看的人不是。

方法2,问他卧室的人,等他回来时给你打电话。

前者是轮询,后者是回调。

所以你说,我能在隔壁等我的同学吗

是的,只是你可以节省时间做其他事情,现在你不得不浪费它。

将原始非阻塞异步调用转换为阻塞同步调用。

在异步调用场景中使用Javascript回调,使用回调性能比轮询好。

因此,回调不一定用于异步,通常用于同步(阻塞)场景,例如在回调函数执行后执行某些操作的请求。

利用回调在一个同步的一个例子(块)执行func2的func1代码执行后。


VaR func1 =函数(回调){
做某事。
(回调typeof(回调)=函数)(回调);
}

func1(还是一样的);
VaR func2 =函数(){
}




异步回调示例:


$(文件)准备好(回调);

$ ajax({
URL
背景:document.body
}。完成(函数(){)
$(这)。AddClass(做);
})失败(函数(){警报(错误));
}总是(函数(){警报());
});




回调什么时候执行

回调函数通常在同步上下文中执行,但在异步情况下不能执行,因为事件没有触发或条件不满足。此外,最好确保回调存在,必须是函数引用或函数表达式:

(回调typeof(回调)=函数)(回调);

让我们粗略定义功能,看起来,它有一个参数,这是一个函数,当函数完成,功能B执行。那么这个过程叫做回调。这句话的意思是:函数B传递到函数中的一种形式参数和顺序执行,然后执行参数B,B是回调函数。让我们来看看下面这个例子。


函数A(回调){
警报(A);
callback.call(本); / /回调(回调。适用),或(本),个人偏好
}
函数B(){
警报(B);
}
调用
甲(乙);



结果是A,然后是B,问某人如何写这样的代码是什么意思看来它不会起太大作用!

是的,我认为这并不意味着,如果你调用函数在函数中直接调用它,它就不起作用了。我只写一个小例子并做初步的了解。这在编写代码的过程中很少使用,因为在大多数场景中,我们必须传递参数:


函数C(回调){
警报(C);
callback.call(这会);
}
调用
c(函数(e){)
警报(e);
});



这个电话似乎不熟悉。这里E参数被赋值给。我们只是将它分配给字符通道并将其分配给对象。

回调函数的使用

资源加载:在动态加载JS文件执行回调函数,加载iframe执行回调,回调Ajax操作,图片加载完成执行回调,Ajax等。
DOM事件和Node.js的事件是基于回调机制(Node.js的回调可能是一个多层回调嵌套问题)。
的setTimeout延迟时间是0,这个程序经常被使用,和setTimeout调用函数实际上是一个回调的体现。
电话:当调用链的链,其中赋值(setter)的方法(或方法本身不返回值)和易于实现的价值链称为(吸气)是相对不好是因为你需要调用链,该值返回到你需要的数据而不是this指针,如果你想做外链的方法可以用来实现回调函数
的setTimeout和setInterval函数调用的返回值。两函数是异步的,即:主要的过程他们通话的时间和程序是相对独立的,因此其主要等待他们的返回值没有办法,他们打开程序不会停止等待的时候,否则就会失去setTimeout和setInterval的意思,所以还没有意义,只有回调。回调的意义在于及时通知定时器执行结果的代理功能。


当函数的实现很长时,您是否选择等待函数完成进程,还是使用回调函数进行异步处理在这种情况下,使用回调函数非常重要,例如:Ajax请求。如果使用回调函数进行处理,代码将继续执行其他任务,而不必等待!

下面是一个更全面的示例,说明如何使用Ajax加载XML文件,并使用调用()函数在请求对象(请求对象)上下文中调用回调函数。


函数FN(URL,回调){
VaR HttpRequest; / /创建XHR
window.xmlhttprequest HttpRequest =新XMLHttpRequest():
window.activexobject新的ActiveX对象(微软。XMLHTTP ):定义;
对IE进行功能检查

httprequest.onreadystatechange =函数(){

如果(httprequest.readystate httprequest.status = = = 4 = = = 200){ / /状态判断
callback.call(HttpRequest. responseXML之外);

}

};

HttpRequest.open(
HttpRequest.send();
}

FN(文本),函数(调用函数)
console.log(本); / /输出语句
});
console.log(这将运行在上述回调。); / /第一输出语句




我们请求异步处理,即当我们开始要求,我们告诉他们打电话给我们的功能,当它们完成。事实上,onreadystatechange事件处理程序也必须考虑请求失败。在这里,我们假设XML文件存在,可以成功地通过浏览器加载。在这个例子中,异步函数分配给onreadystatechange事件,所以它不会立即执行。

最后,第二console.log语句首先执行,因为回调函数直到完成请求的执行。

以上是本文的全部内容,希望能对大家有所帮助。