Javascript绑定使用其实例

时间:2016-09-19 05:08:48

标签: javascript this

让我们拿一个对象

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

请说明这两行代码之间的区别。

3 个答案:

答案 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将是windowwindow.a将是undefinedwindow.b也将是undefined }。因此undefined + undefined将返回NaN。正如你所说,不是30

答案 1 :(得分:2)

在第二段代码中,op相同的对象

也就是说,p.ao.a引用相同的值:

var o = {x: 5, f: function() {return this.x;}};
var p = o;
o.x = 10;
console.log(p.x) // 10

第二段代码的结果与thisbind无关。

.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())或闭包可能是您正在寻找的。