2011-12-22 76 views
2

好了的变量,我偶然发现了这段代码..奇特的JavaScript结构:在对象定义对象类型

如何来工作的吗? JavaScript使用什么样的邪恶方案来解决变量?

我认为它是一种C++类型的人:类/对象定义包含一个不存在的对被定义类的对象的引用。真的,怎么样?

(说实话,我理解部分 - 我可以推断出怎样及何时JS解析名称..但也许这样的问题会更多的使用给别人,有一天一个稻草人概念)

有罪代码:

function Sio() { 
    this.someValue = 5; 
    this.doStuff = function() { 
     console.log("look: "+howDoYouResolveThisYouFoulCreature.someValue); 
    }; 
} 

var howDoYouResolveThisYouFoulCreature = new Sio(); 

这似乎是错误的。

回答

3

很多的概念在这里,我不知道哪一个是给你的烦恼......

两个最有可能的有new/thisvar

new/this

当调用的this值由在其中调用它的上下文确定的函数。

如果使用new关键字,则创建函数的实例并将该实例作为上下文。

当您致电howDoYouResolveThisYouFoulCreature.doStuff()时,您正在以全局身份访问该实例。它通常会更有意义:

this.doStuff = function() { 
    console.log("look: "+ this.someValue); 
}; 

由于foo.doStuff(),使foodoStuff()这invokation上下文(这使得Sio不同实例之间的功能可重复使用)

var

  1. JavaScript中的范围在功能级别。
  2. 使用var something函数内的任何地方都会范围变量到功能
  3. 它被认为是很好的做法,使用单一var声明在函数的顶部,以避免混乱

此外,doStuff功能在howDoYouResolveThisYouFoulCreature之前没有被调用。在那之前,所有重要的是函数在语法上是正确的,这个变量是什么类型并不重要。

1

它的工作原理是在创建howDoYouResolveThisYouFoulCreature之前不执行this()this.doStuff。请记住,无论doStuff()被调用的变量名称是多少,您都将始终使用console.log howDoYouResolveThisYouFoulCreature.someValue。

1

这样做是因为:

var howDoYouResolveThisYouFoulCreature = new Sio(); 

...其实解析为:

var howDoYouResolveThisYouFoulCreature; 
howDoYouResolveThisYouFoulCreature = new Sio(); 

所以在功能 doStuff分配时, var已声明。

编辑:忘记了,我是愚蠢的。原来pimvdb是正确的,而这里的证明(also on jsfiddle):

function A() { 
    this.logValue = function() { 
     if (b === undefined) { 
      console.log('Wah, wah, wah...'); 
     } else { 
      console.log(b.someValue); 
     } 
    }; 
} 

function B() { 
    this.someValue = 42; 
} 

var a = new A(); 
a.logValue(); // Wah, wah, wah... 

var b = new B(); 
a.logValue(); // 42 

所以执行上下文是关键。当构建Sio(或者在这种情况下,A)时,它的范围是在某个时刻可以定义b可能是。该变量在函数被调用之前不会被解析,在此时它可能被定义。或不。没什么大不了的。 :-)

+0

这不一定重要;如果该函数引用一个不存在的变量,也可以为该变量分配一个函数。 – pimvdb 2011-12-22 15:59:48