作用域,它是指对某一变量和方法具有访问权限的代码空间。当我们在定义变量的时候,会定义两种变量,一种是在全局环境下定义的变量,叫全局变量,一种是在函数中定义的变量叫局部变量。全局变量的作用域就是全局环境,局部变量的作用域就是函数。
javascript高级程序设计书中写到,当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。 作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量则来自下一个包含环境,这样一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。
看一小段代码:
1 var colorA = "red";
2 function abc{
3 var colorB = "blue";
4 function info{
5 var color ="yellow";
6 console.log(colorA);-------1
7 console.log(colorB);-------1
8 console.log(colorC);-------1
9 };
10 info;
11 console.log(colorA);-------2
12 console.log(colorB);-------2
13 console.log(colorC);-------2
14 };
15 abc;
16 console.log(colorA);-------3
17 console.log(colorB);-------3
18 console.log(colorC);-------3 出现这种情况的原因就是去查找变量值的时候,是先从自身所在的环境中查找,没找到的时候,沿着作用域链向外层查找,所以在内层可以访问到外层定义的变量,在外层是访问不到内层所定义的变量的。
我们都听说过javscript是没有块级作用域的,javascript执行的是函数作用域,那么什么是块级作用域呢?
什么是函数作用域?
为什么说javascript没有块级作用域,看一段以下代码:
1 var color="red";
2 if(true){
3 var color = "blue";
4 console.log(color);
5 }
6 console.log(color);4、变量声明提升
我们先不管上面的输出是什么,先来看看这几行代码的输出是什么;
console.log(a);var a ; //undefined;
出现这种情况就是因为变量声明提升,我们去声明一个变量的时候javascript引擎会把变量"提前"声明,而把赋值放在原来的顺序。
故输出a的时候只是创建了变量还没有被赋值,所以输出为undefined;
注:对undefined作加减乘除会把它转化为数字类型,undefined转化为数字类型就是NaN;
故输出为 NaN 和 100 ;
