让我们拿一个对象
var o = {a : 10 ,b:20,f:function(){ return this.a + this.b; }};
console.log(o.f())//30 works as expected
现在,
var o = {a:10,b:20,f:function(){ return this.a + this.b; }};
var p = o;
p.a = 1;
p.b = 4;
console.log(p.f()); // 5 works fine
console.log(o.f()); //5,it should 30 right but why it is showing 5
为什么它会像这样工作。如果我o.f()
,它应该从对象o
获取值。
看起来我还没有正确理解绑定
console.log(o.f.bind(o)())//gives 5
console.log(o.f.bind(this)())//gives 30
请说明这两行代码之间的区别。
答案 0 :(得分:3)
您正在为另一个变量分配object
引用,而不是副本。
var o = {a:10,b:20,f:function(){ return this.a + this.b; }};
var p = o; //Assigning the reference of o to p.
因此它表现得像那样,这就是语言的运作方式。
当谈到你的第二个问题时,
console.log(o.f.bind(o)()); // 5
这根本没有任何影响。您根本不会更改该函数的this
值。
但是第二行代码,
console.log(o.f.bind(this)()); // NaN
将该函数的this
值更改为正在执行this
的上下文的bind
值。例如,如果您从窗口的上下文执行它,this
将是window
,window.a
将是undefined
而window.b
也将是undefined
}。因此undefined + undefined
将返回NaN
。正如你所说,不是30
。
答案 1 :(得分:2)
在第二段代码中,o
和p
是相同的对象。
也就是说,p.a
和o.a
引用相同的值:
var o = {x: 5, f: function() {return this.x;}};
var p = o;
o.x = 10;
console.log(p.x) // 10
第二段代码的结果与this
或bind
无关。
.bind(newObject)
创建一个新函数,其值this
“已更改”为指定的newObject
。 (旁白:在方法之外使用this
通常没有意义,因为它将被定义为window
[它也包含所有全局变量]。)
例如,请考虑以下对象:
var u = {x: 5, f: function() {return this.x;}};
var v = {x: 20};
如果您要将方法从u
“复制”到v
,您可以这样做:
v.f = u.f.bind(v);
console.log(u.f()) // 5 // .bind() doesn't change the old function
console.log(v.f()) // 20
答案 2 :(得分:1)
p = o
复制引用,而不是创建新对象。使用构造函数(在原型中使用f()
)或闭包可能是您正在寻找的。 p>