关于原生js中bind函数的简单实现

JavaScript024

关于原生js中bind函数的简单实现,第1张

今天继续研究了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函数的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

问题1:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/htmlcharset=utf-8" />

<title>Simple JQuery</title>

<script type="text/javascript" src="js/jquery.js"></script>

<script type="text/javascript">

$(function(){

$('#mybtn').bind('click', {a : 'hello', b : 'world'}, myFun)

})

function myFun(e) {

alert(e.data.a)

alert(e.data.b)

}

</script>

</head>

<body>

<input type="button" id="mybtn" value="Click me." />

</body>

</html>

如上面例子,可以传递多个参数。

-------------------------------------------------------

问题2:

$('<p>Test</p>').appendTo('.inner')

$('.inner').append('<p>Test</p>')

上面这个是append()和appendTo()区别,应该一目了然了吧?

而appendChild()不是jquery的方法,而是javascript原生的方法。

append和appendChild的关系是:

其实几乎一样,append就是调用appendChild实现的,只是在append前,做一个简单判断。下面贴下jquery的源代码:

append: function() {

return this.domManip(arguments, true, function( elem ) {

if ( this.nodeType === 1 ) {

this.appendChild( elem )

}

})

}

--------------------------------------------------

问题3:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/htmlcharset=utf-8" />

<title>Simple JQuery</title>

<script type="text/javascript" src="js/jquery.js"></script>

<script type="text/javascript">

$(function(){

$('#mybtn').bind('click', myFun)

})

function myFun() {

alert($(this).attr('value'))

}

</script>

</head>

<body>

<input type="button" id="mybtn" value="Click me." />

</body>

</html>

第3个问题不是看的很明白?直接调用应该可以呀,看看这个例子是不是你想要的?

---------------------------------------------------

问题4:网上有很多,查看参考链接这个吧。