Should I use window.variable or var?
我们有很多设置JS代码,用于定义将在许多其他JS文件中使用的面板,按钮等。
通常,我们会这样做:
grid.js
1 | var myGrid = ..... |
combos.js
1 | var myCombo = ..... |
然后,在我们的应用程序代码中,我们:
的application.js
1 2 3 | function blah() { myGrid.someMethod() } |
someother.js
1 2 3 4 | function foo() { myCombo.someMethod(); myGrid.someMethod(); } |
那么,我们应该使用
有什么不同?
功能上潜在的重要差异是
1 2 3 4 5 6 7 8 9 10 | 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 ) |
我建议创建一个名称空间变量
1 | App.myGrid = ... |
这样你就可以限制全局命名空间的污染。
编辑:关于变量问题的数量 - 想到2个可能的解决方案:
例如:你有
1 2 3 4 | function foo() { myCombo.someMethod(); myGrid.someMethod(); } |
变为:
1 2 3 4 5 6 7 8 9 10 | 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:如果需要公开内部组件,则将它们添加到构造函数内部
1 2 3 | if (myVar) { //do work } |
并且
1 2 3 | if (window.myVar) { //do work } |
没有错误,并按照人们的预期工作。
除此之外,正如其他人所说,你应该从一个全局对象下降,以避免污染全局命名空间。
在全球范围内,这两者实际上是功能相同的。在函数范围中,当需要闭包的行为时,
我会一直使用
问题的一般答案是使用
更具体地说,始终将您的代码放在一个立即调用的函数表达式(IIFE)中:
1 2 3 4 5 | (function(){ var foo, bar; ...code... })(); |
这使像
1 | window.foo = foo; |
JavaScript具有功能范围,充分利用它是非常好的。你不希望你的应用程序破解只是因为其他程序员做了一些愚蠢的事情,就像覆盖你的计时器句柄一样。
除了其他答案之外,值得注意的是,如果在声明变量时不在函数内部使用
为了扩展Liviu所说的内容,请使用:
1 2 3 4 5 | App = (function() { var exports = {}; /* code goes here, attach to exports to create Public API */ return exports; })(); |
通过这样做,您可以隐藏一些特定于实现的代码,您可能不希望通过使用