【问题标题】:Issue with calling javascript objects调用 javascript 对象的问题
【发布时间】:2012-09-13 03:00:34
【问题描述】:

我对 javascript 对象还很陌生,我可以对调用变量做一些澄清。我正在尝试在 bar 函数中调用测试变量。这可能吗?如果是这样,我将如何正确地做到这一点?

var foo = {

    bar: function()
    {
        var test = 'Hello World';
    },

    speak: function()
    {
        // Log the Variable from above ^^
        console.log(foo.bar.test);
    }

};

谢谢

【问题讨论】:

    标签: javascript oop variables object


    【解决方案1】:

    没有;局部变量在其声明函数之外是不可见的。

    相反,您需要为对象添加一个属性:

    foo.test = ...;
    

    你也可以设置foo.bar.test;这将为函数对象添加一个属性。

    【讨论】:

      【解决方案2】:

      当你在函数内部声明一个局部变量时,你将它添加到函数的VariableEnvironment 中(这与外部的LexicalEnvironment 本质上没有区别,但是ECMA 区分了它们)。该函数引用了声明它的作用域的LexicalEnvironment(在我们的例子中,全局对象窗口)。当您尝试从函数内部引用变量时,引擎首先在函数的原生VariableEnvironment 中搜索它,然后如果没有找到,则在外部LexicalEnvironment 中搜索。在您的情况下,您尝试从函数的外部引用一个变量,因此引擎一开始就在全局对象的范围内搜索它。

      所以,要完成你的任务,你应该在外部范围中声明变量,然后在函数内部分配它,或者你应该给对象添加一个新属性,然后引用它:

      var foo = {
          test: 'Hello world',
          speak: function()
          {
              console.log(this.test);
          }
      
      };
      

      【讨论】:

        【解决方案3】:

        您可以通过在调用 bar 方法时返回它来访问测试。

        var foo = {
        
            bar: function()
            {
                var test = 'Hello World';
               return test;
            },
        
            speak: function()
            {
                // Log the Variable from above ^^
                console.log(foo.bar());
            }
        
        };
        

        【讨论】:

        • 谢谢,两个回答都帮了大忙。
        【解决方案4】:

        为了以这种方式访问​​变量 test,您需要将其定义为对象的属性,如下所示:

        var foo = {
            test: 'Hello World, before calling bar()',
            bar: function()
            {
                this.test = 'Hello World';
            },
            speak: function()
            {
                // Log the Variable from above ^^
                console.log(this.test);
            }
        };
        console.log(foo.test);
        

        我还更改了函数以使用关键字 this 访问对象 foo。它通常会起作用,但有时在 javascript 中跟踪您的范围可能会很棘手,所以请尽量注意这一点。

        【讨论】:

          猜你喜欢
          • 2023-04-09
          • 1970-01-01
          • 2021-10-23
          • 2011-07-17
          • 1970-01-01
          • 2014-10-19
          • 2017-06-08
          • 2016-08-10
          • 1970-01-01
          相关资源
          最近更新 更多