我应该使用window.variable还是var?

cbm*_*eks 55 javascript global-variables

我们有很多设置JS代码,用于定义将在许多其他JS文件中使用的面板,按钮等.

通常,我们会这样做:

grid.js

var myGrid = .....
Run Code Online (Sandbox Code Playgroud)

combos.js

var myCombo = .....
Run Code Online (Sandbox Code Playgroud)

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

的application.js

function blah() {
    myGrid.someMethod()
}
Run Code Online (Sandbox Code Playgroud)

someother.js

function foo() {
    myCombo.someMethod();
    myGrid.someMethod();
}
Run Code Online (Sandbox Code Playgroud)

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

有什么不同?

use*_*716 59

功能上潜在的重要差异window.myGrid可能是deleted,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 )
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,因为它实际上回答了这个问题. (11认同)

Liv*_* T. 40

我建议创建一个命名空间变量 var App = {};

App.myGrid = ...
Run Code Online (Sandbox Code Playgroud)

这样你就可以限制全局命名空间的污染.

编辑:关于变量问题的数量 - 想到2个可能的解决方案:

  1. 您可以通过类型(网格,按钮等)或关系(ClientInfoSection,AddressSection等)进一步命名它们.
  2. 您将方法封装在使用您拥有的组件实例化的对象中

例如:你有

function foo() {
    myCombo.someMethod();
    myGrid.someMethod();
}
Run Code Online (Sandbox Code Playgroud)

变为:

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();
Run Code Online (Sandbox Code Playgroud)

这样你就可以限制小对象的数量,只暴露你需要的东西(即foo函数)

PS:如果需要公开内部组件,则将它们添加到构造函数内部


aep*_*eus 12

一个很好的用途window.variable是你可以检查它而不会出现javascript错误.例如,如果您有:

if (myVar) {
    //do work
}
Run Code Online (Sandbox Code Playgroud)

并且myVar未在页面上的任何位置定义,您将收到javascript错误.然而:

if (window.myVar) {
    //do work
}
Run Code Online (Sandbox Code Playgroud)

没有错误,并按照人们的预期工作.

var myVar = 'test'并且window.myVar = 'test'大致相同.

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


Jer*_*man 8

在全球范围内,这两者实际上是功能相同的.在功能范围内,var当需要闭合行为时,当然是优选的.

我会一直使用var:首先,它与闭包中通常首选的行为一致(因此,如果您决定稍后再将其移动到闭包中更容易),其次,它对我来说感觉更加语义说我正在创建一个变量而不是附加窗口的属性.但在这一点上它主要是风格.

  • 它们并不完全相同.可以使用`delete`运算符删除`window`的属性,而不能删除使用`var`声明的变量.此外,仅使用`var`的代码可移植到非浏览器环境. (7认同)

zzz*_*Bov 6

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

更具体地说,始终将您的代码放在一个立即调用的函数表达式(IIFE)中:

(function(){
  var foo,
      bar;
  ...code...
})();
Run Code Online (Sandbox Code Playgroud)

这使变量,如foobar从污染全局命名空间.然后,当您明确希望变量位于全局对象上时(通常window),您可以编写:

window.foo = foo;
Run Code Online (Sandbox Code Playgroud)

JavaScript具有功能范围,充分利用它是非常好的.你不希望你的应用程序破解只是因为其他程序员做了一些愚蠢的事情,就像覆盖你的计时器句柄一样.