foo(&mut x, |a| a, |a| a);
控制台记录为3乘以300,这是最后一个元素的x。我不知道这种结果如何发生?
答案 0 :(得分:4)
基本上,与推送无关。当您执行self.x = x
时,它正在更新作为窗口的全局对象(例如,在全局范围内),并且您正在返回window。您的数组包含[window, window, window]
,并且每次您在窗口中覆盖x
和y
时。使用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;