块级作用域即 {......}
尽管js支持一堆花括号创建的代码,但是并不支持块级作用域;而仅仅支持函数作用域。
//js中的函数作用域
function test(){
for(var i=0;i<19;i++){
document.write(i);
}
document.write(i);//10,此时i还在作用域内
}
//c#中的块级作用域
public void Get()
{
for (int i = 0; i < 10; i++)
{
Response.Write(i);
}
Response.Write( i); //错误:当前上下文中不存在名称"i"
}
//js
//例1
var a=1;
(function test(){
alert(a);
var a =2;
alert(a);
})()
alert()的第一次调用时显示“undefined”,第二次调用时显示“2”。
//例2
var a=1;
(function test(){
alert(a);
var a ;
alert(a);
})()
alert()的第一次调用时显示“undefined”,第二次调用时显示“undefined”。
当在函数内声明的变量与函数外的变量(即全局变量)同名时,那么就有效地隐藏了这个全局变量。由于作用域的限制,局部变量在整个函数体内部都是有定义的(函数中声明的所用变量,无论在哪里声明,在整个函数中都是有定义的),这就意味着在整个函数体中都隐藏了同名的全局变量。虽然局部变量在整个函数体中都是有定义的,但是在执行var语句声明初始化(例1)之前,它是不会被初始化的。
首先,函数内部的作用域总是优先于上层作用域,当函数作用域内的变量与上层作用域的变量重名时,起作用的将是函数自身的变量;其次,JavaScript会自动把函数内的变量声明提升到作用域的最前面。所以,例1的代码相当于:
var a=1;
(function test(){
var a; //a的声明会被js自动提升到这里
alert(a); //这个时候a尚未赋值,所以是undefined
a=2; //a被赋值
alert(a); //这个时候a就有值了
})();