JavaScript中的新绑定?

时间:2018-08-05 16:11:31

标签: javascript binding

在下面的绑定片段中

function foo(something) {
    this.a = something;
}

var obj1 = {};

var bar = foo.bind( obj1 );
bar( 2 );
console.log( obj1.a ); // 2

var baz = new bar( 5 );
console.log( obj1.a ); // 2
console.log( baz.a ); // 5

在此步骤var bar = foo.bind( obj1 );中,我们将obj1绑定到foo函数中。

执行bar(2)后,obj1的值为2。

是否想知道bar(2)触发了什么?

我的假设

由于bar被分配给foo并与obj1绑定,因此调用bar(2)可能已经分配了this.a = 2并将该值保留在{{1}中}(即obj1 = {a:2})。

我的假设正确吗?

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

这里bind(obj1)的工作方式就像您将scope foo的默认function覆盖为obj1一样,因此this关键字被替换为空白对象( obj1中的foo)。

function foo(something) {
    //this = {}  (obj1);
    //this.a == obj.a
    this.a = something;
}

var obj1 = {};

var bar = foo.bind(obj1);

答案 1 :(得分:2)

在函数上调用bind()将返回一个新的绑定函数。当您调用此绑定函数时,它将以您传入的上下文作为第一个参数执行原始函数。因此,this中的foo会在通过绑定函数调用时指向obj1

答案 2 :(得分:2)

要了解这一点,您需要首先使用.bind做什么?

bind是一个函数,它返回另一个称为bound的函数。

function x (){
  console.log(this.item)
}

考虑以上代码,对item是什么一无所知。

var obj = { item  : 10};

考虑此对象,该对象确实知道其item属性。

x对象(该函数)上调用.bind时,它将返回该函数的相同副本(称为 bound ),但具有obj {item: 10}的上下文。

var bound = x.bind(obj);

该特定语句说,在obj的上下文中赋予该特定功能。

现在,如果我们调用bound(),它将打印10

答案 3 :(得分:0)

您的假设是正确的。

 var bar = foo.bind( obj1 );

使bar成为foo对象的引用。因此,您现在可以通过bar访问该功能。

 bar( 12 );

如果您呼叫console.log(),依此类推,将打印12。