数组推送会更改所有元素

时间:2018-08-15 20:07:12

标签: javascript

foo(&mut x, |a| a, |a| a);

控制台记录为3乘以300,这是最后一个元素的x。我不知道这种结果如何发生?

3 个答案:

答案 0 :(得分:4)

基本上,与推送无关。当您执行self.x = x时,它正在更新作为窗口的全局对象(例如,在全局范围内),并且您正在返回window。您的数组包含[window, window, window],并且每次您在窗口中覆盖xy时。使用this来创建原型的对象,如果使用new,则无需返回;

答案 1 :(得分:2)

self

  

Window.self只读属性返回窗口本身,作为WindowProxy。可以在窗口对象(即window.self)或独立对象(self)上使用点符号。

this

  

在大多数情况下,this的值取决于函数的调用方式。在执行过程中不能通过赋值来设置它,并且每次调用该函数时可能会有所不同。

您可以通过使用或不使用this关键字来注意到示例中new的不同之处:

function foo() {
  console.log({
    isThisEqualToWindow: self === this,
    self: self.toString(),
    this: this.toString()
  });
}

new foo();
foo();

虽然self始终引用window对象,但是this可以引用new创建的对象(使用函数作为构造函数)或{{ 1}}对象,因为函数调用的上下文。

关于您的特定示例,由于您使用的是window构造函数,因此new将引用创建的对象,并且将按预期工作:

this

答案 2 :(得分:0)

您还可以执行var self = this;