Javascript如何评估"这"?

时间:2015-09-11 16:36:44

标签: javascript variables object methods

我想了解一些基本的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());




3 个答案:

答案 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.namewindow.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;
&#13;
&#13;

答案 1 :(得分:2)

嗯,只需要反思,让我们分析一下:

  • 在第一个提示中,我们调用了getName()方法 obj.value对象,因此它返回obj.value.name "HocusPocus"
  

alert( obj.value.getName() );我们称this.nameobj.value,因此名称为HocusPocus

  • 但是在第二个提醒我们正在创建一个新功能testing() 使用getName()方法的主体,因此它将被附加到 全局window对象,如果我们调用它,我们将获得全局 name值为'Gerorge Thomas'
  

alert(testing());我们正在处理this.nam e,其中this指的是全局范围,因此名称为'Cinderella'

答案 2 :(得分:1)

首先,您从obj对象内部调用方法。第二次,你在全球范围内复制了这个功能(不是真的,它只是一个参考)。所以你也可以为第二个电话写window.testing()。我认为这说得很清楚。