星期二, 四月 02, 2013

Javascript 变量范围问题.

一段简单的代码引出的问题:

function test1()
{
    for (i=0;i<3 br="" i="">      {
          print("test1:"+i);
          }
    }
   
function test2()
{
    for (i=0;i<3 br="" i="">      {
          print("test2:"+i);
          test1();
          }
    }
   
   
test2();

得到结果,出乎人的意料:
test2:0
test1:0
test1:1
test1:2

修改函数test1 如下:
function test1()
{
    for (var i=0;i<3 br="" i="">      {
          print("test1:"+i);
          }
    }
 得到结果,符合预期:
test2:0
test1:0
test1:1
test1:2
test2:1
test1:0
test1:1
test1:2
test2:2
test1:0
test1:1
test1:2


这是因为Javascript的变量范围 scope是函数级别的,并没有其他语言级别的local概念。

所以为了避免递归或者嵌套查询问题,最好在变脸名前宣布var,或者使用Ecmascript 1.7
里的let关键词来避免这种情况。