当'this'发生变化时,为什么JavaScript变量填充'this'会发生变化?

时间:2013-05-22 13:14:10

标签: javascript variables this

function Class () {

var self = this;
this.hi = true; // this { hi: true }, self { hi: true }
self.hi = false; // this { hi: false }, self { hi: false }

}

为什么自我行为不像普通变种?

2 个答案:

答案 0 :(得分:5)

这是因为this(总是)是一个对象,而不是一个原语。

当您将包含(或更准确地“指向”)对象的变量分配给新变量时,两个变量都指向同一个对象 - 它是“按引用复制”。通过两个变量都可以看到对该对象的内容的更改。

将包含原语的变量分配给新变量时,将该值的副本分配给新变量。对原始变量的更改不会影响新变量。

答案 1 :(得分:1)

这里self没有什么特别之处。尝试使用任何两个变量名称。这就是大多数现代语言的工作方式。

var x = {};
var y = x;

x.hi = true; // x { hi: true }, y { hi: true }
y.hi = false; // x { hi: false }, y { hi: false 

作为Jack pointed out,这里要实现的关键是两个变量都引用同一个对象。

请注意,如果您希望在此类情况下“按值复制”(复制对象),则可以选择。某些库(例如UnderscoreLo-Dash)具有clone方法,您可以使用该方法创建新对象并使用与另一个相同的属性填充它:

var y = _.clone(x);