JavaScript:做用域和做用域链

一.做用域:变量或者函数能够起做用的范围,变量退出做用域以后会销毁,全局变量关闭网页或浏览器才会销毁。浏览器

①全局做用域:在<script>或者一个独立的js文件中,全局做用域中定义的变量是全局变量。在任何位置均可以访问。函数

1 var num = 15;//全局变量
2 function fn() {
3   str = 'qaq';// 这里不用var声明也是全局变量(不规范)
4   console.log(num);
5   console.log(str);
6 }
7 fn();//15 qaq
8 console.log(str);//qaq

②局部做用域:一个函数有一个局部做用域,局部做用域中定义的变量是局部变量。局部变量只能够在定义此变量的函数里访问。spa

1 function fn() {    
2   var num = 15;// 局部变量
3 }    
4 console.log(num);// num is not defined

③块级做用域:ES5前没有,一对花括号({和})中的语句集都属于一个块。块外不能访问块内变量。code

1 {
2   // 代码块
3   var num = 15;
4   console.log(num);//15
5 }
6 console.log(num);//num is not defined

二.做用域链: 函数内指向函数外的链式结构叫作做用域链。blog

 1 // 全局做用域 --- 0级做用域链
 2 var num = 5;
 3 function f1() {
 4   // f1 局部做用域 --- 1级做用域链
 5   var num = 15;
 6   function f2() { 
 7     // f2 局部做用域 --- 2级做用域链
 8     console.log(num);
 9   }
10   f2();//步骤2:函数f1里定义局部变量num和函数f2,而后调用f2
11 }
12 f1();//步骤1:全局做用域下定义变量num和函数f1,而后调用f1
13 //步骤3:f2打印num,可是在f2里没有找到num,因而往上一级找,找到了num是15,打印。
14 //若是将f1里的num等于15注释掉,那么会继续往上找,找到全局做用域的num,那么打印结果是5

相关文章
相关标签/搜索