JS之bind浅析及应用场景

JavaScript033

JS之bind浅析及应用场景,第1张

fn.bind(obj, args)

bind() 方法会创建一个函数,该函数的 this 指向了传入的第一个参数,当 bind() 的参数为空时, this 指向全局对象。如浏览器中的 window

因为 js 是一门 Duck typing 语言,所以我们可以通过 bind 实现一些共有方法。

有的时候我们需要针对特定的 this 调用某些方法。写起来比较麻烦,这个时候就可以使用 bind 创建一个 shortcut 方便调用。

bind 也可以绑定构造函数,但是当执行生成的函数时,会忽略this指向,即使在绑定时已经对其赋值。

今天继续研究了bind函数的实现,也知道了shim和polyfill的说法,现在总结一下,

if

(!Function.prototype.bind)

{

Function.prototype.bind

=

function

(oThis)

{

if

(typeof

this

!==

"function")

{

//

closest

thing

possible

to

the

ECMAScript

5

internal

IsCallable

function

throw

new

TypeError("Function.prototype.bind

-

what

is

trying

to

be

bound

is

not

callable")

}

var

aArgs

=

Array.prototype.slice.call(arguments,

1),

fToBind

=

this,

fNOP

=

function

()

{},

fBound

=

function

()

{

return

fToBind.apply(this

instanceof

fNOP

&&

oThis

?

this

:

oThis

||

window,

aArgs.concat(Array.prototype.slice.call(arguments)))

}

fNOP.prototype

=

this.prototype

fBound.prototype

=

new

fNOP()

return

fBound

}

}

这是官方文档上的实现,我分二个方面来谈我要说的东西,

第一个是参数,agruments的使用

var

aArgs

=

Array.prototype.slice.call(arguments,

1),这里是将bind函数的参数数组取出来,第一个参数不要(就是不要oThis)也就是要被绑定方法的那个对象,第二个是

aArgs.concat(Array.prototype.slice.call(arguments)))

这里是用了数组的方法,把参数插在参数数组后面,要注意,这个函数是要被return

出去然后执行的,他的参数数组是return出去的那个fBound函数的参数数组,所以上下两个参数数组是不一样的,有点像柯里化。

第二个是上下文,在其中上下文的变化比较难理解,bind函数主要就是为了绑定上下文来使用的

fToBind

=

this

这里是保存了对象的上下文,紧接着下面的apply方法让要被绑定的那个对象可以使用该上下文

fNOP.prototype

=

this.prototype

fBound.prototype

=

new

fNOP()

这里是以fNOP为中介把this.prototype这个原对象的属性给fBound,确保fBound是在定义的时候的那个上下文里面执行。本来

bound.prototype

=

self.prototype就可以将原属性集成过来了,但是这样两个对象属性都指向同一个地方,修改

bound.prototype

将会造成self.prototype

也发生改变,这样并不是我们的本意。所以通过一个空函数

nop

做中转,能有效的防止这种情况的发生。

以上这篇关于原生js中bind函数的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。