我应该使用window.variable或var?

我们有很多设置JS代码,它们定义了面板,button等等,这些JS代码将被用在许多其他JS文件中。

通常,我们做类似的事情:

grid.js

var myGrid = ..... 

combos.js

 var myCombo = ..... 

然后,在我们的应用程序代码中,我们:

的application.js

 function blah() { myGrid.someMethod() } 

someother.js

 function foo() { myCombo.someMethod(); myGrid.someMethod(); } 

所以,我们应该使用var myGrid或更好地使用window.myGrid

有什么不同?

我会build议创build一个名称空间variablesvar App = {};

 App.myGrid = ... 

这样你可以限制全球名字空间的污染。

编辑:关于variables问题的数量 – 2可能的解决scheme想到:

  1. 您可以通过types(网格,button等)或关系(ClientInfoSection,AddressSection等)进一步命名空间,
  2. 你把你的方法封装在用你拥有的组件实例化的对象中

例如:你有

 function foo() { myCombo.someMethod(); myGrid.someMethod(); } 

变为:

 var Foo = function(combo, grid) { var myCombo = combo;//will be a private property this.myGrid = grid;//will be a public property this.foo = function() {//public method myCombo.someMethod(); myGrid.someMethod(); } } App.myFoo = new Foo(someCombo, someGrid); App.myFoo.foo(); 

这样你就可以限制小对象的数量,只显示你需要的(即foo函数)

PS:如果你需要公开内部组件,那么把它们添加到构造函数中

在function上潜在的重要区别是, window.myGrid可以delete d,而var myGrid不能。

 var test1 = 'value'; window.test2 = 'value'; console.log( delete window.test1 ); // false ( was not deleted ) console.log( delete window.test2 ); // true ( was deleted ) console.log( test1 ); // 'value' ( still accessible ) console.log( test2 ); // ReferenceError ( no longer exists ) 

window.variable的一个很好的用法是你可以检查它没有一个JavaScript错误。 例如,如果您有:

 if(myVar){ //do work } 

myVar没有在页面的任何地方定义,你会得到一个JavaScript错误。 然而:

 if(window.myVar){ //do work } 

没有错误,并且可以按照预期的方式工作。

var myVar ='test'; 和window.myVar ='test';

大致相当。

除此之外,正如其他人所说,你应该从一个全局对象下降,以避免污染全局名称空间。

在全球范围内,两者在function上是等效的。 在函数范围内,当需要closures行为时, var肯定是可取的。

我会一直使用var :首先,它与闭包中的通常首选行为是一致的(因此,如果您稍后决定将代码移动到闭包中,则更容易);其次,它只是感觉更多的语义我说我创build一个variables,而不是附加窗口的属性。 但在这一点上大部分都是风格。

这个问题的一般答案是使用var

更具体地说,总是把你的代码放在立即调用的函数expression式(IIFE)中 :

 (function(){ var foo, bar; ...code... })(); 

这使像foobar这样的variables不会污染全局名称空间。 然后,当你明确想要一个variables在全局对象(通常是window )上,你可以写:

 window.foo = foo; 

JavaScript具有function范围,充分利用它是非常好的。 你不希望你的应用程序打破,只是因为其他程序员做了一些愚蠢的事情,比如覆盖你的计时器句柄。

除了其他的答案之外,值得注意的是,如果你在声明一个variables的时候没有在函数内部使用var ,它会自动泄漏到全局作用域,使之成为window对象(或者全局作用域)的一个属性。

为了扩展利维所说的,使用:

 App = (function() { var exports = {}; /* code goes here, attach to exports to create Public API */ return exports; })(); 

通过这样做,您可以隐藏一些您的实现特定代码,您可能不希望使用var内部公开的代码。 但是,您可以访问任何附加到exports对象的东西。