在讨论绑定()方法之前,让我们先看一个问题:

无功altwrite =段;

altwrite(你好);

上面的代码有什么问题1。

2的正确操作是什么。

如何实现 / / 3.bind()方法

对于以上题目,答案并不太难。主要测试点是这个指向的问题。Altwrite()函数改变这个方向全球或窗口对象,导致异常的非法调用执行时。正确的解决方案是使用绑定()方法。

Altwrite.bind(文件)(你好)

当然,您还可以使用调用()方法:

altwrite.call(文件,你好)

本文的重点是讨论第三个问题绑定()方法的实现,并且在我们开始讨论绑定()的实现之前,让我们先看看绑定()方法的使用情况:

结合功能

最简单的使用绑定()是创建一个函数,使得函数具有相同的价值无论怎么叫。一个常见的错误,如上面的例子,以方法的对象,然后调用它,并希望这一点原始对象。如果没有特殊的处理完成后,原来的对象将丢失。bind()方法可以解决这个问题的一个美丽的:




this.num = 9;
VaR的mymodule = { {
Num:81,
GetNum:函数(){退货。民;}
};

module.getnum(81); / /

无功getnum = module.getnum;
(getnum); / / 9,因为在这种情况下,这指的是全局对象

/ /函数创建a'this'bound模块
无功boundgetnum = getnum.bind(模块);
BoundGetNum(81); / /



部分函数(部分函数)

部分函数也称为部分应用程序,它截取部分函数定义的一部分:

部分应用可以描述为接受一个函数,即项目的第二部分是对与错。

这是一个很好的特性,使用绑定()设置函数的预定义参数,然后将调用传递给其他参数:


函数列表(){
返回array.prototype.slice.call(参数);
}

无功表=表(1, 2, 3); / / { 1, 2, 3 }

预定义的参数 37
无功leadingthirtysevenlist = list.bind(定义,37);

var = leadingthirtysevenlist(清单); / / { 37 }
var目录3 = leadingthirtysevenlist(1, 2, 3); / / { 37, 1, 2,3 }



使用setTimeout

总的来说,setTimeout()的这一点,一个窗口或全局对象。使用一个类的方法的时候,你需要一本指向一个类的实例,你可以使用绑定()将这个回调函数来管理实例。




功能布鲁默(){
this.petalcount = math.ceil(Math.random()* 12)+ 1;
}

调用声明函数后的第二秒
Bloomer.prototype.bloom =函数(){
window.settimeout(this.declare.bind(这),1000);
};

Bloomer.prototype.declare =函数(){
console.log(我有+ this.petalcount +花瓣!
};



注:以上方法也可以用于事件处理函数和setInterval方法

作为构造函数的绑定函数

绑定函数也适用于使用新操作符构造目标函数的实例。当使用绑定函数构造实例时,注意这将被忽略,但传入参数仍然可用。




函数点(x,y){
这个;
这个,y = y;
}

point.prototype.tostring =函数(){
返回这个x++;
};

var =新点(1, 2);
(p.tostring); / / '1,2


无功emptyobj = { };
无功yaxispoint = point.bind(emptyobj,0 / * * /);
该示例不支持,
/本机绑定支持:
无功yaxispoint = point.bind(null,0 / * * /);

无功axispoint =新yaxispoint(5);
(axispoint ToString); / / '0,5

axispoint instanceof点; / /真的
axispoint是yaxispoint; / /真的
新点(17, 42)是yaxispoint; / /真的



在上面的例子中,点和yaxispoint分享原型,所以instanceof运算符用于判断真。

快捷方式

绑定()还可以为需要特定值的函数创建快捷方式。

例如,要将对象数组转换成真正的数组,可能的例子如下:


var片= array.prototype.slice;

…

Slice.call(参数);


如果使用绑定(),情况就变得简单了。




无功unboundslice = array.prototype.slice;
var片= Function.prototype.call.bind(unboundslice);

…

切片(参数);



实现

上面的部分显示绑定()具有多种使用场景,但绑定()函数在ECMA-262第五版新增。它可能不能在所有浏览器上运行,这需要我们自己实现绑定()函数。

首先,我们可以通过指定目标函数的范围来简单地实现绑定()方法:


function.prototype.bind =功能(上下文){
这就是调用目标函数的绑定方法
返回函数(){
返回self.apply(语境参数);
};
};



考虑到库里的函数,我们可以建立一个更强大的(绑定):




function.prototype.bind =功能(上下文){
var args = array.prototype.slice.call(参数1),
自我=这个;
返回函数(){
无功innerargs = array.prototype.slice.call(参数);
无功finalargs = args.concat(innerargs);
返回self.apply(上下文,finalargs);
};
};



此绑定()方法可以绑定对象,也支持绑定时引用的传递。

继续,Javascript的功能也可以用作构造函数。当以这种方式调用绑定函数时,情况就更加微妙了。它涉及到原型链的传递。




function.prototype.bind =功能(上下文){
var args = array.prototype.slice(参数1),
f =函数(){ },
自我=这个,
绑定=函数(){
无功innerargs = array.prototype.slice.call(参数);
无功finalargs = args.concat(innerargs);
返回self.apply((这是F:上下文),finalargs);
};

f.prototype = self.prototype;
bound.prototype =新的f();
返回绑定;
};



这是结合Javascript的Web应用程序(一本书)的实现:通过设置一个传递函数和构造函数F,bind()的结合在同一个原型链功能,随着新算子函数调用绑定后,返回的对象也可以使用正常的实例,所以这是最严格的(绑定)的实现。

为了支持浏览器中的绑定()函数,只需稍微修改上面的函数就可以了。




function.prototype.bind =功能(o){
如果(typeof这!=函数){
抛出TypeError(function.prototype.bind -什么是想肯定不是));
}

无功aargs = array.prototype.slice.call(参数1),
这ftobind =,
浮点空操作=函数(){ },
fbound =函数(){
返回ftobind.apply(
这是这这这| |浮点空操作窗口,
AArgs.concat(array.prototype.slice.call(参数))
);
};

fnop.prototype = this.prototype;
fbound.prototype =新的浮点空操作();

返回fbound;
};



Javascript结合以上分析()方法是萧边和大家分享的内容的使用和实施,希望能给大家一个参考,我希望你能支持它。