注意:js中,一个函数里面若有循环体,则在循环体中定义的变量作于域会是整个函数,这一点根其他高级语言不一样。下面例子中的testVar(),在for循环中定义了一个局部变量i,该i的作用域就为整个函数体。
例子:
function testNoVar()
{
for(i=0;i<10;i++)
{
if(i==5) break;
}
alert("testNoVar "+i);
}
function testVar()
{
for(var i=0;i<10;i++)
{
if(i==6) break;
}
alert("testVar "+i);
}
testNoVar();
try
{
alert("behind testNoVar i value :"+i);
}
catch(e)
{
alert("behind testNoVar i value :"+e);
}
testVar();
try
{
alert("behind testVar i value :"+i);
}
catch(e)
{
alert("behind testVar i value :"+e);
}
{
for(i=0;i<10;i++)
{
if(i==5) break;
}
alert("testNoVar "+i);
}
function testVar()
{
for(var i=0;i<10;i++)
{
if(i==6) break;
}
alert("testVar "+i);
}
testNoVar();
try
{
alert("behind testNoVar i value :"+i);
}
catch(e)
{
alert("behind testNoVar i value :"+e);
}
testVar();
try
{
alert("behind testVar i value :"+i);
}
catch(e)
{
alert("behind testVar i value :"+e);
}
testNoVar中循环体内的i没有用var来定义,该i为全局变量。而testVar中的循环体用var定义了i,该i为局部变量,于是它不受到前面定义的全局变量的影响,所以该例子打印结果的先后循序为:
"testNoVar 5" -> "behind testNoVar i value :5" -> "testVar 6" -> "behind testVar i value :5"