我有以下代码段
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.
问题实际上是当硬绑定和新绑定同时发生时会发生什么
答案 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
)
我希望有所帮助!