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:网上有很多,查看参考链接这个吧。