我想了解一些基本的javascript。
我有以下代码段。我们有name
变量,在两种情况下都通过getName方法引用。
第一个提醒输出HocusPocus
,而第二个输出GeorgeThomas
。但我不明白this
在这种情况下如何引用名称
var name = 'Gerorge Thomas';
var obj = {
name: 'Cinderella',
value: {
name: 'HocusPocus',
getName: function() {
return this.name;
}
}
};
alert( obj.value.getName() );
var testing = obj.value.getName;
alert(testing());

答案 0 :(得分:4)
要理解此问题,您必须了解Javascript如何在函数调用中设置this
的值。
这里有所有方法的摘要:When you pass 'this' as an argument
对于您的特定情况,当您这样做时:
var testing = obj.value.getName;
您现在可以参考getName
功能。您与obj.value
完全没有任何联系。因此,test()
只是将getName
称为普通函数。在Javascript中进行普通函数调用时,this
的值将是全局对象(浏览器中为window
),或者在严格模式下,它将是未定义的。
在您的情况下,this
成为window
对象,因此this.name
为window.name
,其指向全局变量name
,因此您可以获得结果& #39; Gerorge Thomas'。
事实上,如果您在strict
模式下运行代码,它将导致错误,这实际上是严格模式的一个好处,它指出了像这样的意外错误。
另一方面,如果您执行obj.method()
形式的函数,则this
将设置为obj
。所以,当你这样做时:
obj.value.getName()
相当于:
var o = obj.value;
o.getName()
这是调用函数的obj.method()
形式,它将this
指针设置为对象,在本例中为obj.value
。
可以通过几种方式解决此问题。以下是使用.bind()
解决问题的示例。
var name = 'Gerorge Thomas';
var obj = {
name: 'Cinderella',
value: {
name: 'HocusPocus',
getName: function() {
return this.name;
}
}
};
document.write( obj.value.getName() + "<br>");
var testing = obj.value.getName.bind(obj.value);
document.write(testing());
&#13;
答案 1 :(得分:2)
嗯,只需要反思,让我们分析一下:
getName()
方法
obj.value
对象,因此它返回obj.value.name
"HocusPocus"
。
alert( obj.value.getName() );
我们称this.name
为obj.value
,因此名称为HocusPocus
testing()
使用getName()
方法的主体,因此它将被附加到
全局window
对象,如果我们调用它,我们将获得全局
name
值为'Gerorge Thomas'
。
alert(testing());
我们正在处理this.nam
e,其中this
指的是全局范围,因此名称为'Cinderella'
。
答案 2 :(得分:1)
首先,您从obj
对象内部调用方法。第二次,你在全球范围内复制了这个功能(不是真的,它只是一个参考)。所以你也可以为第二个电话写window.testing()
。我认为这说得很清楚。