我读了一下JS中的绑定实现(来自John Resig的书):
它看起来像这样:(jsbin)
#1Function.prototype.bind = function ()
#2{
#3 var fn = this,
#4 args = Array.prototype.slice.call(arguments),
#5 object = args.shift();
#6
#7 return function ()
#8 {
#9 return fn.apply(object, args.concat(Array.prototype.slice.call(arguments)));
#10 };
#11 };
我可以这样测试:
var myObject = {};
function myFunction()
{
return this == myObject;
}
//---------
if (!myFunction()) alert("Context is not set yet"); //not set ye
var bindedFunction= myFunction.bind(myObject)
if (bindedFunction()) alert( "Context is set properly"); //set properly
//---------
但是我有两个问题:
问题#1
在第3行中,this
是对执行的函数的引用,对吗?但不是this
假设是:“对象,其中包含函数”?
如果我在bind函数中执行alert(this)
,我会看到:
function myFunction()
{
return this == myObject;
}
问题#2
在第9行中,为什么返回函数是
return function ()
{
return fn.apply ...
};
和不
return function ()
{
fn.apply ...
};
我不明白:
返回的函数创建一个闭包,并且应该返回一个只执行fn.apply(o....
我不明白为什么它会返回额外的return
:就像return fn.apply(o....
答案 0 :(得分:2)
在Function.bind
的上下文(没有双关语)中,this
确实引用了当前调用的函数,而不是可能包含它作为方法的“对象”。
记住,当你写
时,函数是JS中的第一类对象myFunction.bind()
然后myFunction
是对象,然后.bind
是该对象的一个方法(通过Function.prototype
继承),然后当你调用它时,正常规则适用 - this === myFunction
。
对于q.2,fn.apply
的结果是必需的,因此绑定函数也可以返回结果,就像原始函数可能具有的那样。
答案 1 :(得分:1)
但这不是假设:“持有该功能的对象”?
没有。这是因为内部fn.bind(obj)
被调用如下:
Function.bind.call(fn, window, obj)
因此,this
是指fn
。
我不明白为什么它会返回额外的回报:比如返回fn.apply(o ....
函数.bind()
用于返回一个函数,该函数在被调用时“代理”来自给定函数的返回值,即myFunction
。如果没有,它将始终返回undefined
。
答案 2 :(得分:0)
#2的答案是绑定函数应该返回原始函数返回的内容,因此它需要一个return语句。