我应该使用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想到:
- 您可以通过types(网格,button等)或关系(ClientInfoSection,AddressSection等)进一步命名空间,
- 你把你的方法封装在用你拥有的组件实例化的对象中
例如:你有
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... })();
这使像foo
和bar
这样的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
对象的东西。