2

我读了一些关于 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
//--------- 

但是我有两个问题:

Question #1

在第 3 行中,thisis 指的是执行的函数,对吗?但不this应该是:“拥有函数的对象”?

如果我alert(this)在绑定函数内部执行,我会看到:

function myFunction()
{
    return this == myObject;
}

Question #2

在第 #9 行,为什么返回的函数是

  return function ()
        {                      
            return fn.apply ...
        };

不是

  return function ()
        {                      
           fn.apply ...
        };

我不明白:

返回的函数创建一个闭包,并且应该返回一个只执行的函数 fn.apply(o....

我不明白为什么它会返回额外return的:就像在return fn.apply(o....

4

3 回答 3

2

在上下文中(没有双关语)Function.bindthis确实指的是当前调用的函数,而不是可能包含它作为方法的“对象”。

记住函数是 JS 中的第一类对象,当你编写

myFunction.bind()

thenmyFunction 对象,然后是该对象.bind的方法(通过继承Function.prototype),然后当您调用它时,将应用正常规则 - this === myFunction

对于 q.2,结果fn.apply必需的,以便绑定函数也可以返回结果,就像原始函数可能具有的一样。

于 2013-04-11T11:00:48.710 回答
1

但这不是假设是:“拥有函数的对象”吗?

不,这是因为内部fn.bind(obj)是这样调用的:

Function.bind.call(fn, window, obj)

因此,thisfn

我不明白为什么它会返回额外的回报:就像 return fn.apply(o....

该函数.bind()旨在返回一个函数,该函数在调用时“代理”给定函数的返回值,即myFunction. 如果没有,它总是会返回undefined

于 2013-04-11T11:05:58.140 回答
0

#2 的答案是绑定函数应该返回原始函数返回的任何内容,因此它需要一个 return 语句。

于 2013-04-11T11:00:49.890 回答