Javascript中的变量声明语法之间的区别(包括全局变量)?

时间:2011-02-01 11:53:40

标签: javascript

声明变量之间有什么区别:

var a=0; //1

......这样:

a=0; //2

...或:

window.a=0; //3

在全球范围内?

5 个答案:

答案 0 :(得分:545)

答案 1 :(得分:39)

保持简单:

a = 0

上面的代码给出了一个全局范围变量

var a = 0;

此代码将提供一个在当前范围内使用的变量,并在其下

window.a = 0;

这通常与全局变量相同。

答案 2 :(得分:10)

<title>Index.html</title>
<script>
    var varDeclaration = true;
    noVarDeclaration = true;
    window.hungOnWindow = true;
    document.hungOnDocument = true;
</script>
<script src="external.js"></script>

/* external.js */

console.info(varDeclaration == true); // could be .log, alert etc
// returns false in IE8

console.info(noVarDeclaration == true); // could be .log, alert etc
// returns false in IE8

console.info(window.hungOnWindow == true); // could be .log, alert etc
// returns true in IE8

console.info(document.hungOnDocument == true); // could be .log, alert etc
// returns ??? in IE8 (untested!)  *I personally find this more clugy than hanging off window obj

是否有一个全局对象默认情况下挂起所有变量?例如:'globals.noVar声明'

答案 3 :(得分:7)

基于 T.J的优秀答案。克劳德 :( 偏离主题:避免混乱window

这是他的想法的一个例子:

<强> HTML

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="init.js"></script>
    <script type="text/javascript">
      MYLIBRARY.init(["firstValue", 2, "thirdValue"]);
    </script>
    <script src="script.js"></script>
  </head>

  <body>
    <h1>Hello !</h1>
  </body>    
</html>

init.js (基于this answer

var MYLIBRARY = MYLIBRARY || (function(){
    var _args = {}; // private

    return {
        init : function(Args) {
            _args = Args;
            // some other initialising
        },
        helloWorld : function(i) {
            return _args[i];
        }
    };
}());

<强>的script.js

// Here you can use the values defined in the html as if it were a global variable
var a = "Hello World " + MYLIBRARY.helloWorld(2);

alert(a);

这是plnkr。希望它有所帮助!

答案 4 :(得分:5)

在全球范围内,没有语义差异。

但是你真的应该避免使用a=0,因为你将值设置为未声明的变量。

还可以使用闭包来避免编辑全局范围

(function() {
   // do stuff locally

   // Hoist something to global scope
   window.someGlobal = someLocal
}());

始终使用闭合装置,并在绝对必要时始终提升到全球范围。无论如何,您应该使用异步事件处理进行大部分通信。

正如@AvianMoncellor所提到的那样,var a = foo只有一个IE错误,只声明了一个全局的文件范围。这是IE臭名昭着的破解翻译的问题。这个错误听起来很熟悉,所以它可能是真的。

坚持window.globalName = someLocalpointer