Javascript 中的类和作用域

Posted

技术标签:

【中文标题】Javascript 中的类和作用域【英文标题】:Class and scope in Javascript 【发布时间】: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 仍是未定义的?

【问题讨论】:

【参考方案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);

【讨论】:

以上是关于Javascript 中的类和作用域的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 中的类和对象

理解回调函数

包和引入

java中import的作用

javascript关于this的用法

JavaScript知识点