对象内部函数内对象文字的范围

时间:2016-04-28 11:21:11

标签: javascript javascript-objects

我正在运行三段代码。第一个起作用,而第二个和第三个起作用。我不确定我理解为什么第二个和第三个不起作用。

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的子范围。 我在这里错过了一些基本的东西。如果这看起来像是一个菜鸟问题的话,但我想我得到了它并且总是不断回到这里。而且,当我查找文档时,我无法在任何地方得到明确的答案,为什么第二个或第三个没有意义。

5 个答案:

答案 0 :(得分:2)

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

user2 = { 
          handle :"mytext", // handle is a property 
          alertName: function(){
                     alert(handle);}
        };
  1. “handle”是对象user2的属性。
  2. 是您要调用的方法的对象。
  3. “handle”是方法“alertName”中 this 的属性。
  4. 因为,handle不是定义的变量,因此是错误。 在第三种情况下,您将句柄定义为方法签名中的参数,但未在调用中传递任何参数,因此它是未定义的。

答案 1 :(得分:1)

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

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

handleproperty的{​​{1}},因此您需要通过引用object的{​​{1}}来访问对象的属性。< / p>

this抛出错误,因为它试图找到一个名为handle的变量,该变量不在范围内。

如果您定义了varibale句柄object,则可以在alert(handle); globally中访问它。

user2

答案 2 :(得分:1)

在第二个例子中,函数&#39; alertName&#39;期望参数&#39;句柄&#39;。 调用user2.alertName(),不带参数结果未定义。

对于作品应该是这样的:

user2.alertName(user2.handle);

答案 3 :(得分: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);

我希望这有帮助,

里斯

答案 4 :(得分:0)

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

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

handle是对象的属性,因此您需要通过引用该对象的对象来访问该对象的属性。