Javascript函数中的四种绑定形式

文本

Javascript中的这一点与函数密切相关,所以今天,我将在Javascript函数中详细介绍这一点。



说到这个,很多抽象的概念让人头晕目眩,跑到这里,我只说一点核心功能,在这个叫它的对象,下一个故事就要围绕这一点展开。



(想起前面的行业准备茶和西瓜。我要开始讲故事了!



{故事}有一个叫迪克西年轻人(这),有一天,意外穿越到一首叫做γ(Javascript)气克利不同的世界,在这一刻的时候身无分文,他要做的第一件事是找到他住的地方使用函数对象


默认绑定

{ 1 }如果故事线迪斯(这个)都没有发现直到傍晚住他家,他开始过着非洲难民的生活,在这个时候,一个魔术师命名窗口村快乐行善救星出现:第一次住在我的家!




{文字}

当一个函数不显式调用对象时,也就是说,当它被称为独立函数时,它将使用对函数的默认绑定:对全局窗口对象的绑定。


函数火(){
console.log(=窗口)
}
火(true);


我认为上面的例子对大多数人来说都很简单,但有时我们把这些例子变成了混乱:


函数火(){
我在函数定义/函数里面!
功能innerfire(){
console.log(=窗口)
}
(innerfire); / /独立的函数调用
}
火(true);


功能innerfire声明和调用外部函数的火,所以谁做的这一点吗它仍然是窗户



许多人可能影响的范围将从innerfire消防功能的关注,但只要我们坚持我们的理论武器时没有明确的调用对象,使用默认的绑定功能:结合全球窗口对象,你可以得到正确的答案。



下面这个增强版本的示例是相同的输出真值


var obj = { {
火:函数(){
功能innerfire(){
console.log(=窗口)
}
(innerfire); / /独立的函数调用
}
}
Obj.fire(真); / /输出


{公告}在这种情况下,对obj.fire呼叫()实际利用这个隐含的结合。这就是我接下来要谈的问题。我将继续解释这个例子。



{ }函数的函数称为独立函数,无论其位置在哪里,其行为性能与在全局环境中直接调用的功能相同。



隐式绑定

{故事线2 }当他碰到Javascript世界时,他带了一些钱,所以他找到了一家旅馆。




当函数包含一个对象时,我们将函数的这个隐式绑定到对象。此时,这可以直接访问绑定对象的其他属性,如以下属性。


var obj = { {
甲:1,
火:函数(){
console.log(这一)
}
}
obj.fire(1); / /输出




现在我们需要对普通代码操作做一些深入的思考。首先,下面两段代码具有相同的效果:


是第一个代码
函数火(){
console.log(这一)
}
var obj = { {
甲:1,
火:火
}
obj.fire(1); / /输出
我是第二代码
var obj = { {
甲:1,
火:函数(){
console.log(这一)
}
}
obj.fire(1); / /输出


消防功能没有任何差异,因为它是对象的内部和外部对象的定义。也就是说,内隐结合以上两种形式下,火可以通过这个访问对象的一个属性,它告诉我们:



1。这是动态绑定的,或者绑定到代码的运行时,而不是写入周期。

2。函数对对象的独立性,转移损失这一点



下面的描述可能是个人的,但不是很严格,但这是因为我希望读者尽可能地了解我想要表达的内容。

在隐式绑定下,作为对象属性的函数,它与对象无关。



根据这个动态绑定的特性,它被写入对象中,作为对象属性的函数,并且独立于对象(函数不是完全由外部对象拥有)。



我想说的是:在上面,虽然函数是在对象的内部和外部语句中定义的,但是它是在对象函数中定义的,那么对象属性名是通过引用函数获得的,这两种方法在本质上是等价的(不仅仅是作用)。



对象中定义的函数正好由对象调用,而不是对象的调用。



在下面的隐式绑定中使用这个传输损耗问题来解释:


var obj = { {
答:1 / /定义属性的obj对象1
火:函数(){
console.log(这一)
}
}
var = 2;在2中的全局环境变量中定义了a。
无功fireingrobal = obj.fire;
fireingrobal(2); / /输出


Interesting the simple code is the reference to the obj fire function (fireInGrobal) at the time of the call, performance (output) do not see it is defined within the obj, the reason is: we implicitly bound this lost!!因此,当fireingrobal呼叫,这不是目标,但窗口



上面的例子稍微变成了一个bug:可能会困扰我们。



在山顶,我们


var a=2;
var obj = { {
答:1 / /在obj对象的属性定义
火:函数(){
console.log(这一)
}
}
功能otherfire(FN){
(FN);
}
otherfire(obj。火); / /输出2


关键是otherfire函数,以函数的引用作为参数,然后直接打在里面,但它假定FN的参数仍然可以通过这个来实现对象内部的属性,但事实上,这种结合的目标已经失去,所以输出值一个(全球2),而不是在一个目标值(1)



在一系列对象属性中,这将绑定到最内层的对象。

在隐式绑定中,如果函数调用位置位于对象属性链的字符串中,则绑定到最内层的对象:


var obj = { {
甲:1,
obj2:{
甲:2,
OBJ3:{
甲:3,
功能有:(){
console.log(这一)
}
}
}
}
obj.obj2.obj3.geta(3); / /输出


显式绑定:(调用和绑定方法)

{故事-第3行}这是来自不同的世界,Javascript,通过努力积累了一些财富。所以他买了他自己的房子。




我们前面提到的隐式绑定,就是这种结合的损失问题,为fireingrobal = obj.fire

该fireingrobal调用的结果是不同的obj.fire称,由于分配功能的过程中不经过这个受火过去。此时,调用函数使用。

呼叫的基本使用:fn.call(对象)

FN是您调用的函数,对象参数是您希望这个函数绑定到函数的对象。

fn.call(对象)的作用:

1。立即调用这个函数(FN)

2。当函数被调用时,这个函数指向对象对象。



实例uff1a


var obj = { {
答:1 / /在obj对象的属性定义
火:函数(){
console.log(这一)
}
}
var a = 2;在全局环境变量中定义
无功fireingrobal = obj.fire;
fireingrobal(2); / /输出
fireingrobal.call(obj); / /输出1


fireingrobal,而失去了这个参数被绑定到目标上,再把这个还给obj



然而,我们真的不喜欢这个电话每一个电话,我们希望一次性还给这fireingrobal功能永久地绑定到目标上,所以我们没有打电话叫尾每fireingrobal这么麻烦。



我该怎么办聪明的你能想到的,它的包装功能外fireingrobal.call好(obj)!


var obj = { {
答:1 / /在obj对象的属性定义
火:函数(){
console.log(这一)
}
}
var a = 2;在全局环境变量中定义
var fn = obj.fire;
无功fireingrobal =函数(){()
fn.call(obj) /硬约束
}
fireingrobal(1); / /输出


使用绑定会更容易一些。


无功fireingrobal =函数(){()
fn.call(obj) /硬约束
}


它可以简化为:


无功fireingrobal = fn.bind(obj);


调用和绑定的区别是将此绑定到对象参数:



1.call将立即执行函数

2.bind不执行一个函数,返回的是一个函数,可以执行



{其他}:对于应用程序,除了使用方法之外,它与调用没有多大关系。



在这里,我绑定了显式绑定和隐式绑定,并将函数和包含该函数的对象之间的关系与购买和租赁的区别进行了比较。




因为这个



在隐式绑定下:该函数只能暂时住在一个包含对象的酒店,并且可能在几天后在另一家旅馆。

在显式绑定下:函数将在包含的对象中获得永久居住权,并且将永远住在这里。

新的结合

{故事} DISS(这)建立了自己的家庭,生很多孩子(通过构造函数的许多新的对象)




当执行新操作时,将创建一个新对象,并将此构造函数指向创建的新对象。




函数(a){
这个;
}
var =新富(1);
新富(2);
var =新富(3);
var =新富(4);
console.log(A1,) / /输出1;
console.log(A2,) / /输出2;
console.log(A3 a) / /输出3;
console.log(A4,) / /输出4;


总结

以上是在Javascript函数经萧边介绍四本的装帧形式。希望能对你有所帮助。如果你有任何问题,请给我留言,萧边会及时给您回复。谢谢您支持网站。