我正在读一本书,它说函数内的this
用4种不同的方式设置。使用new
语法的默认,隐式,显式绑定+。在所有情况下,在函数调用时都设置this
。看一个例子。
当我调用jajca()
时,我期望通过默认绑定设置this
。也就是说,当调用jajca()
时this
已被设置为是使用new
语法创建的。但是由于某种原因,我不理解,尽管通过默认绑定,this
内的jajca
指向窗口,this
应该指向使用new
创建的对象。
function jajca() {
this.musicFolderPath = "value2"; // never gets assigned to the correct this.musicFolderPath
}
function Music(){
this.musicFolderPath;
jajca(); // music.musicFolderPath is undefined
// jajca.call(this); music.musicFolderPath is correctly set
}
var music = new Music();
//music.musicFolderPath is undefined
您能解释为什么未设置this
的原因吗?如果使用显式绑定,则this
会按预期指向使用new
关键字创建的对象。
答案 0 :(得分:-2)
当我调用jajca()时,我希望可以通过默认绑定进行设置。这就是调用jajca()时已将其设置为使用新语法创建的对象。但是出于某种我不理解的原因,即使通过默认绑定,jajca中的这个指针仍指向窗口,这应该指向使用new创建的对象。
这个主旨是,无论何时调用另一个函数,this
表示的对象都会被“重置”。 (-根据“这”的含义的各种规则-这就是您的书所涉及的。例如,当您执行obj.bar()
时,this
中bar
的值将就是obj
。这就是为什么在执行this.baz()
时,“ this”值“保持不变”的原因:this
中的baz
等于当前值this
值。)
这是一个非常深入的话题,您的书可能比我在StackOverflow简短回答中写得更详细,但是如果您在学习时牢记这一点,您会更容易理解。
>在这种情况下,是的,您想要做jajca.call(this)
来使this
中的jajca
的值成为您想要的值。