2010-08-04 36 views
2

今天晚些时候,我是通过ejhon.com幻灯片滚动,我发现了以下工作:JavaScript的新的关键字和对象作用域

给这个代码

function katana() { 
this.myvar = true; 
} 
katana(); 
console.info (myvar); 

过去的那一刻我编译的代码,我认为myvar附属于katana功能。实际上,它会附加到污染全局命名空间的窗口对象。

我回到自己的项目,这些项目都采用同样的办法..有点不同

function katana() { 
this.myvar = true; 
} 
var xyz = new katana(); 
console.info (myvar); 

我有一个函数对象,而不是执行的功能,我只是创建它的一个新实例(我并不确定发生了什么)。然后我使用xyz存储值并通过原型方法使用这些值来完成一些工作。

让我感到惊讶的是,当我用FireBug进行一些调试时,xyz并不存在。没有变量附加​​到窗口对象。为什么?

我做了一些更多的调试,xyz对象连接到window> object,但是在DOM中它并不明显,也没有任何痕迹。在调试窗口中还有一些新东西,一个叫做“scopechain”的节点带有一个调用,它具有xyz对象的值。

好的,底下发生了什么?这是一种我应该坚持的好方法,还是我应该寻找替代方案? 我看了一些问题和答案,我主要是在寻找这种方法在后台做什么。

+0

阅读本文http://ejohn.org/apps/learn/ – 2010-08-04 19:35:04

+0

其实我正在浏览它。我只是寻找更深的解释,因为这些幻灯片只显示结果。 – 2010-08-04 19:42:25

回答

2

当您说new katana()时,Javascript会调用katana函数,其中一个新的空白对象为this。一旦它返回,大概初始化,新的对象(或任何katana返回,只要它是一个对象)被设置为使其“原型”(它将继承字段等的对象)与katana函数的原型。

是的,这也没有什么意义,或者我第一次经历它。过于简化的版本是,你说new katana(),和Javascript创建什么将是katana实例,并让katana函数初始化它。你说katana()this基本上是调用堆栈中最后一个在实例方法调用中使用的对象。 (如果您的来电是x.foo,this == x。)如果没有这样的对象,看起来thiswindow相同。

至于为什么xyz没有出现,您声明变量为var。这改变了范围。如果你摆脱了这一点,你会看到一个window.xyz

+0

很好的答案。我主要是想知道地下发生了什么。那么FireBug中新的'scopechain'节点呢?另外xyz似乎被附加到窗口对象,它只是不存在于DOM中。 – 2010-08-04 19:44:23

+0

我不使用FireBug(或Firefox,就此而言)。 'scopechain'的东西可能是Firefox追踪范围的方式。但它似乎并没有出现在Chrome中,而且据我所知,它不是标准的Javascript/ECMAScript。 – cHao 2010-08-05 02:45:08

相关问题