对象内函数内对象字面量的范围

Scope of an object literal within a function inside the object

我是运行三段代码。第一个有效,而第二个和第三个无效。我不确定我是否理解为什么第二个和第三个不起作用。

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

到这里,我了解到handle是赋值给user2对象的,是user2对象上的一个key。因此,当我调用 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 的子范围的函数。 如果这看起来像是一个菜鸟问题,我是不是漏掉了一些基本的东西 here.Apologies,但我想我明白了,并且总是回到这里。关于为什么在查找文档时第二个或第三个没有意义,我无法在任何地方得到明确的答案。

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

user2 = { 
          handle :"mytext", // handle is a property 
          alertName: function(){
                     alert(handle);}
        };
  1. "handle" 是对象 user2 的 属性。
  2. this 是您正在调用方法的对象。
  3. "handle" 是方法 "alertName" 中 this 的 属性。

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

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); 抛出错误,因为它试图找到一个不在范围内的名为 handle 的变量。

如果您定义变量句柄 globally,那么您可以在 user2 object.

中访问它
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
user2 = { 
          handle :"mytext", 
          alertName: function(){
                     alert(this.handle);}
        };

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

handle是对象的属性,所以需要通过this引用对象来访问对象的属性。

在第二个示例中,函数 'alertName' 需要一个参数 'handle'。 不带参数调用 user2.alertName() 会导致未定义。

作品应该是这样的:

user2.alertName(user2.handle);

我将从代码示例开始,然后进行解释。

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);

希望对您有所帮助,

里斯