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 中的类和作用域的主要内容,如果未能解决你的问题,请参考以下文章