【问题标题】:Class and scope in JavascriptJavascript 中的类和作用域
【发布时间】:2011-10-07 03:17:56
【问题描述】:

我用 Javascript 编写了以下代码。

function main()
{
    this.a ;
    this.set = function()
    {
        a = 1;
    }
}

var l = new main();

alert("Initial value of a is "+ l.a );
l.set();
alert("after calling set() value of a is   "+ l.a );

在这两种情况下,我都将 a 的值设为未定义。为什么即使在我调用 set() 之后 a 仍是未定义的?

【问题讨论】:

    标签: javascript class scope


    【解决方案1】:

    您需要通过this.a 引用a

    否则,您指的是局部变量 a(如果您使用了 var,省略它会在 window 对象上创建一个 a 属性,本质上是一个全局变量)而不是对象的属性 @987654328 @(this 将绑定到新创建的对象)。

    jsFiddle.

    【讨论】:

    • 对;当你说a = 1; 时,你声明了一个名为a 的全局变量。
    • @JustinEthier:干杯,我说得更清楚了 :)
    • 谢谢大家。我只是Javascript课程的初学者。我现在了解变量的范围
    【解决方案2】:

    到javascript这个:

    function main()
    {
        this.a ;
        this.set = function()
        {
            a = 1;
        }
    }
    

    看起来像

    function main();
    
    { // starts unattached object literal
        this.a ;
        this.set = function();
    
        { // starts another unattached object literal 
            a = 1; // sets value to   window.a
        }
    }
    

    【讨论】:

      【解决方案3】:

      您的“set”函数缺少对this 的引用:

         this.a = 1;
      

      【讨论】:

        【解决方案4】:

        除了前面的答案:Javascript 中没有类,只有对象。你可以构造类的东西,但是javascript继承模型是prototypal。在您的代码中,main 是一个 constructor function,您可以从中派生实例。

        许多人仍在尝试将 javascript 强制转换为各种经典的 OOP 模式。这一切都完全有可能,但它削弱了语言。花点时间看this series of lectures

        【讨论】:

          【解决方案5】:

          你不能像你做的那样声明一个未定义对象的属性。并且您在 case 方法中错误地引用了属性 a。这是更正:

          function main() {
              this.a = null;
              this.set = function() {
                  this.a = 1;
              }
          }
          
          var l = new main();
          
          alert("Initial value of a is " + l.a);
          l.set();
          alert("after calling set() value of a is   " + l.a);
          

          【讨论】:

            猜你喜欢
            • 2011-12-11
            • 2015-08-22
            • 1970-01-01
            • 1970-01-01
            • 2017-01-16
            • 2017-06-18
            • 2010-10-12
            • 2011-05-09
            • 2017-04-14
            相关资源
            最近更新 更多