Javascript和[bind]实现?

时间:2013-04-11 10:55:30

标签: javascript

我读了一下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....

一样

3 个答案:

答案 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语句。