有var 先声明一个变量
没有声明就是在赋值的时候生成。
声明变量使用是防止未知错误的好方法。

解决方案 »

  1.   

    <script language="JavaScript">
    function av(){
    var a,b;
    alert(a);
    alert(b);
    }
    function av2(){
    var b;
    alert(a);
    alert(b);
    }
       </script><input type=button value=click onclick="av()">
    <input type=button value=click onclick="av2()">
      

  2.   

    我个人的看法是用var的话,这个变量是一个局部变量,如果你没用var,那这个变量就默认为一个全局变量
      

  3.   

    全局和局部的区别,甚至可以和vbscript混用
      

  4.   

    晕.  用了var  也可以是全局变量呀..只是看在什么地方用,
    在函数里用了var 就是局部
      

  5.   

    从Context对象的角度来看,用不用var都没有区别
      

  6.   

    但我们编程考虑的不止是Context对象,所以,最好不要仅仅从某一方面考虑,你试着理解原型,相信对你JS技术的提升是会有非常大的帮助的。
      

  7.   

    wideroad() 说得对,顶他一下
      

  8.   

    hansonboy(良) 的说法也是正确的,就是说你在全局的地方这两种写法是一样的,如果实在局部的某个地方(比如函数中),var声明的变量是局部变量,没有var声明的是全局变量
      

  9.   

    是否要来点官方的解释?(微软JScript参考)JScript 在运行代码前处理变量声明,所以声明是位于一个条件块中还是其他某些结构中无关紧要。JScript 找到所有的变量后立即运行函数中的代码。如果变量是在函数中显式声明的 — 也就是说,如果它出现于赋值表达式的左边但没有用 var 声明 — 那么将把它创建为全局变量。
      

  10.   

    楼上的说的是错误的,
    下面的代码就没有把a输出来,
    <script>
    function f(){
      a =1;
      
    }
    b = 2;
    alert(a);
    alert(b);
    </script>
      

  11.   

    等待高手来解析var与没有var的区别?
      

  12.   

    可以参考这个:
    The var statement is used to declare a variable, and outside of a function its use is optional. While a variable can be declared simply by assigning it a value, it is good practice to use var as there are two cases in functions where it is necessary:    If a global variable of the same name exists.    If recursive or multiple functions use variables of the same name.
      

  13.   

    建议任何地方都是用var声明变量!这是一个好的编程习惯。函数内不使用var 申明的时候,变量是全局变量(怪怪的)。
    而且,申明的时候引擎还会遍历堆栈查找是否存在该变量(局部,with块,全局.....)。性能上也会打折扣!!
      

  14.   

    楼上的说的是错误的,
    下面的代码就没有把a输出来,
    <script>
    function f(){
      a =1;
      
    }
    b = 2;
    alert(a);
    alert(b);
    </script>
    ---------------------------------------------------------
    f()没有执行 ,当然alert不出来了
      

  15.   

    我个人的看法是用var的话,这个变量是一个局部变量,如果你没用var,那这个变量就默认为一个全局变量-------- 你的认为是正确的。~v~ 正解
    直接使用变两表明为全局的。使用了var关键字的表示只在本作用域内有效
      

  16.   

    呵呵,有点意思^_^我想加一点:
    其实JS与C和C++在变量作用域上有很大不同。JS中,函数内声明的变量,无论是在什么地方声明的,它都会影响整个函数,甚至影响同名的全局变量。下面代码很直观说明了:
    a='111';
    function f()
    {
      alert(a);
      var a="222";
      alert(a);
    }
    f();
      

  17.   

    to brothercat(水星上疯狂上网的猫 ^_^) 你举的这个例子不对,第一个显示undefined是因为你后面声明了a,所以开始的时候他认为局部变量a还没有,所以显示undefined,你把你的例子改成a='111';
    function f()
    {
      alert(window.a);
      var a="222";
      alert(a);
    }
    f();
    alert(a);就知道区别了
      

  18.   

    to wideroad() :哈哈趁帖子还热,跟到发个问题:
    个人理解计算机查找变量,先是在当前作用域查找,如果没有找到则返回到他上一层查找直到查到顶层。a='111';
    function f()
    {
      alert(window.a);
      //问题是:在这个地方a是否存在呢?这个时候函数f中不存在他应该返回查找才对啊。而f的顶层应该是window。所以这里的 window.a 为什么不等于 (global.a)呢。唯一的理由就是,window并不是所谓的全局。但是这样也说不通。就算还有高于window层次的作用域,这里的a也应该等于window.a才对,因为window应该就是f内作用域的父作用域吧。搞糊涂了。。
      var a="222";
      alert(a);
    }
    f();
    alert(a);
      

  19.   

    wideroad() 你这样理解也可以,但解析过程并不是你想的那样a='111';
    function f()
    {
      alert(a);
    }
    f();
    你说结果是什么呢?你写的程序没有问题,但那还是作用域的问题。我的意思很简单:局部变量会影响整个函数,甚至影响到同名全局变量在函数中的执行情况。我写的实际上等同于:
    a='111';
    function f()
    {
      var a;
      alert(a);
      a="222";
      alert(a);
    }
    f();在JS解析器中,变量是先声明在赋值的过程。
      

  20.   

    至于你写的这一段a='111';
    function f()
    {
      alert(a);
    }
    f();因为函数里没有同名的变量,所以直接指向全局变量a
      

  21.   

    至于解析过程,你可以看《javascript权威指南》,里面有很详细解释,这个我就不随意发言了,呵呵
      

  22.   

    javascript是一种弱类型的解释语言,所以声明变量的时候用不用var都是一样的,因为即使之前声明了不过不执行赋值语句程序还是不知道这个变量是什么类型的(undefined).而且可以对一个变量赋以不同类型的值,变量的类型会根据所赋值的类型而相应改变,可以用typeof检查.这个java的强类型语言大不相同.
      

  23.   

    即使之前声明了不过不执行赋值语句程序还是不知道这个变量是什么类型的(undefined)
    =============================================================================嗯,shaolinquan()说的和我前面说的:
    在JS解析器中,变量是先声明再赋值的过程。表达的是一样的^_^
      

  24.   

    to shaolinquan用不用var是不一样的不管怎么样,最好所有的变量都用var声明,这是一种良好的编程习惯,而且可以避免很多问题,JS本来就调试起来比较麻烦,如果因为这种小的坏习惯导致了错误,那可就有的查了
      

  25.   

    是啊上次在asp.net的客户端回调最后得接收函数中写了一句
    for(i=0;i<10;i++)
    结果就在它自动生成的脚本中产生一个脚本错误,后来加了个var就好了
    原来是这里的i影响了生成的那段代码啊
    而且那些生成的代码中的for都没有var的学习啊
      

  26.   

    最好养成声明的习惯。
    假设下面的代码:function GetNodeValue(TREENODES)
    {
    var treeNode=TREENODES.getChildren();
    var Node;
    var nodeLength=treeNode.length;
    var i;
    for(i=0;i<nodeLength;i++)
    {
    var nodetext=treeNode[i].getAttribute("TEXT");
    alert("GetNodeValue:"+nodetext);
    GetNodeValue(treeNode[i]);
    }}假设没有那句 var i; ,递归调用将会失效,for循环里面i的值将一直为0。
      

  27.   

    还是没有弄明白,
    改天把JavaScript好好研究研究,再来看这个问题,
    先收藏了,
      

  28.   

    ===========情况1=================================================
    <script language="javascript">
           z=1;//全局变量
            function aa()
    {
       alert(z);
       z=2;  //z为函数里,没有用var声明的全局变量
       alert(z);
    }
    bb();
    alert(z)//结果为2
    </script>
    ===========================================
    ==================情况2====================
    <script language="javascript">
        z=1;//全局变量
    function bb()
    {
       var z
       alert(z);//结果为undefined
       z=2;  //z为函数里,用var声明的局部变量
       alert(z);//结果为2
    }
    bb();
    alert(z)//结果为1
    </script>================情况3====================
    <script language="javascript">
        z=1;//全局变量
    function cc()
    {
       var z
       alert(window.z);//结果为1.用到对象的方法去考虑!
       z=2;  //z为函数里,用var声明的局部变量
       alert(z);//结果为2
    }
    cc();
    alert(z)//结果为1
    </script>