Javascript新的硬绑定

时间:2016-06-15 17:16:12

标签: javascript this

我有以下代码段

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

var obj = {a: 77};

var bar = function() {
    return foo.apply( obj, arguments );
};

var o = new bar( 2 );

console.log( o.a ); // I think it's 2(why is it undefined?)
console.log(obj.a); // obj.a changed to 2, got it.

为什么o.a未定义?如果我删除了return中的bar关键字,它仍将是相同的。

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

var obj = {a: 77};

var bar = function() {
    foo.apply( obj, arguments );
};

var o = new bar( 2 );

console.log( o.a ); // I think it's 2(why is it undefined?)
console.log(obj.a); // obj.a changed to 2, got it.

问题实际上是当硬绑定和新绑定同时发生时会发生什么

2 个答案:

答案 0 :(得分:1)

使用new将创建一个新对象,并将该对象指定为this到您调用它的函数。在您的情况下,您没有使用新对象,而是将函数设置obj称为this

至于为什么添加和删除return不会改变任何内容是因为在这两种情况下,您都返回undefined。当使用new调用函数并返回undefined(a.k.a是默认返回值)时,它将返回new生成的新对象。

引用MDN

  

构造函数返回的对象成为整个新表达式的结果。如果构造函数未显式返回对象,则使用在步骤1中创建的对象。 (通常构造函数不返回值,但如果他们想要覆盖正常的对象创建过程,他们可以选择这样做。)

所以你创建一个新对象但操纵一个旧对象。你的代码有效地工作。

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

var obj = {a: 77};

var bar = function() {
    return foo.apply( obj, arguments );
};

var o = {}; // Originally you used `new` to create a new object
bar(2); // Since `bar` doesn't use `this`, it's the same as if it were called by itself

console.log(o.a); // Empty object
console.log(obj.a); // Modified by `bar`

答案 1 :(得分:1)

您必须从this返回foo(a),如下所示:



function foo(a) {
    this.a = a;
    // "this" NEEDS TO BE RETURNED, OTHERWISE (bar)'s 
    // VALUE WILL BE UNDEFINED, THUS o.a WILL BE UNDEFINED
    return this; 
}

var obj = {a: 77};

var bar = function() {
    // MAKE SURE THIS IS RETURNED AS WELL
    return foo.apply( obj, arguments );
};

var o = new bar( 2 );

console.log( o.a ); // I think it's 2(why is it undefined?)
console.log(obj.a); // obj.a changed to 2, got it.




  

问题实际上是硬绑定和新绑定时会发生什么   绑定发生在同一时间

在这种情况下,没有任何内容,因为new bar( 2 )的新实例在其返回值取决于foo(a)时无效,而foo(a)依赖于单例(obj

我希望有所帮助!