天天看点

函数作用域与块级作用域

块级作用域即 {......}

尽管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就有值了
})();
           

继续阅读