2016-04-28 193 views
1

我正在运行三段代码。第一个工作,而第二个和第三个不起作用。我不知道我明白为什么第二和第三不起作用。对象内部对象的范围在对象内的函数内

user2 = { 
      handle :"mytext", 
      alertName: function(){ 
        alert(this.handle);} 
     }; 
user2.handle; //"mytext" 
user2.alertName() // alerts "mytext" 

在这里,我明白句柄分配给user2对象,并且是user2对象上的键。因此,当我调用user2.alertName()时,this.handle引用user2.handle,因此打印出正确的值。

但是,为什么不将下面的代码工作的两个版本:

user2 = { 
      handle :"mytext", 
      alertName: function(){ 
        alert(handle);} 
     }; 

user2.handle; //"mytext" 
user2.alertName() // gives error that handle is not defined in the console 

user2 = { 
      handle :"mytext", 
      alertName: function(handle){ 
        alert(handle);} 
     }; 

user2.handle; //"mytext" 
user2.alertName() //gives undefined in the alert popup 

据我了解的范围,处理其在user2的对象被定义应该可用作为user2的子范围的函数。 我在这里错过了一些基本的东西。如果这看起来像一个noob问题,但我认为我知道了,并总是不断回来。我无法在任何地方得到明确的答案,因为当我查找文档时为什么第二个或第三个没有意义。

+0

感谢,并在这里,我向一个重要的点。使用对象名称和'this'是不一样的。我查了下面的答案,以了解不同之处http://stackoverflow.com/questions/25226693/whats-the-difference-between-using-this-and-the-object-name-for-reference-insi。希望它也能帮助其他人 –

回答

1
user2 = { 
      handle :"mytext", 
      alertName: function(){ 
        alert(handle);} 
     }; 

user2.handle; //"mytext" 
user2.alertName() // gives error that handle is not defined in the console 

handleobjectproperty,所以你需要通过this它指的是object访问对象的属性。

alert(handle);抛出错误coz它试图找到一个名为handle的变量不在范围内。

如果您定义了varibale句柄globally,那么您可以在您的user2object中访问它。

var handle="google"; 

user2 = { 
      handle :"mytext", 
      alertName: function(){ 
        alert(handle);} 
     }; 

alert(user2.handle); //"mytext" 
user2.alertName() // gives error that handle is not defined in the console 
2

在你的第二个和第三个代码:

user2 = { 
      handle :"mytext", // handle is a property 
      alertName: function(){ 
        alert(handle);} 
     }; 
  1. “把手” 是对象用户2的属性。
  2. 这个是你正在调用的方法的对象。
  3. “句柄”属于这个属性的方法“alertName”。

因为,句柄不是定义的变量,所以错误。 在第三种情况下,您将方法定义为方法签名中的参数,但不会在调用中传递任何参数,因此将其定义为未定义。

0
user2 = { 
      handle :"mytext", 
      alertName: function(){ 
        alert(this.handle);} 
     }; 

user2.handle; //"mytext" 
user2.alertName() // alerts "mytext" 

句柄是对象的属性,所以你需要通过这个它是指对象来访问对象的属性。

1

在第二个示例中,函数'alertName'需要一个参数'handle'。 调用没有参数的user2.alertName()结果未定义。

对于作品应该是这样的:

user2.alertName(user2.handle); 
+0

这很有趣。所以'user2.handle'仍然可用。当对象 - user2或这个 - 没有明确提及时,句柄是否变得模糊不清? –

1

我将与代码示例,随后的解释开始。

var user2 = { 
    handle :"mytext", 
    alertName: function() { 
    //var handle is not defined in the current lexical scope or globally. 
    alert(handle); 
    } 
}; 

user2.handle; //"mytext" 
user2.alertName() // gives error that handle is not defined in the console 

说明: 要定义user2.alertName。在这个功能中,您打电话给alert(handle)。从我所看到的handle未在当前词汇范围内定义,或全局,因此undefined被警告。

var user2 = { 
    handle :"mytext", 
    alertName: function(handle){ 
    alert(handle); 
    } 
}; 

user2.handle; //"mytext" 
user2.alertName() //gives undefined in the alert popup 

说明: 你定义user2.alertName。该功能需要一个提醒的参数。 当你调用user2.alertName()时,你没有传递任何变量或文字。 因此,undefined被警告。 提醒user2.handle使用:

user2.alertName(user2.handle); 

我希望这有助于

里斯的答案