作用域和作用域链简单介绍:
只要是一门程序语言,那么作用域就是一个不可逃避的问题,下面就通过实例简单介绍一下javascript的作用域和作用域链。
在javascript中,作用域分为两种:
1.全局作用域
2.局部作用域。
如何界定是何种作用域:
1.定义在所有函数之外的变量是具有全局作用域。
2.定义在函数之内的变量具有局部作用域,它的作用域就是变量所在的函数。
特别说明:所有末定义直接赋值的变量具有全局作用域。
作用域与作用域之间是可以层层包含的:
全局作用域可以包含局部作用域,局部作用域中又可以嵌套其他局部作用域,可以如此无限的嵌套下去。
面罗列几个实例加深一下对概念的理解:
实例一:
<script type="text/javascript"> var x="全局变量x"; var y="全局变量y"; function myfunction() { var x="局部变量x"; var z="局部变量z"; alert(x);//弹出"局部变量x" alert(y);//弹出"全局变量y" } myfunction(); alert(z);//不能弹出内容。 </script>
在以上代码中,当执行myfunction()函数的时候能够分别弹出”局部变量x“和"局部变量y"。但是alert(z)不能弹出内容,因为z变量是定义在函数内的局部变量,不能够在函数体外使用。
从上面的代码可以对局部变量和全局变量有一个基本的了解,要特别主要的是,如果局部变量和全局变量同名,那么局部变量将会覆盖全局变量,具体原因在后面有介绍。
实例二:
<script type="text/javascript"> var x="全局变量x"; var y="全局变量y"; function myfunction() { var x="局部变量x"; var z="局部变量z"; m="全局变量m"; alert(x);//弹出"局部变量x" alert(y);//弹出"全局变量y" } myfunction(); alert(m);//弹出"全局变量m" </script>
在以上代码中,当执行myfunction()函数的时候能够分别弹出”局部变量x“和"局部变量y"。alert(m)能够弹出"全局变量m",尽管m是在函数体内声明并赋值的,但是并没有使用var关键字,所以变量m的作用域是全局的。
实例三:
<script type="text/javascript"> var x="全局变量x"; var y="全局变量y"; function myfunction() { var x="局部变量x"; var z="局部变量z"; m="全局变量m"; alert(x);//弹出"局部变量x" alert(y);//弹出"全局变量y" function innerfunction() { var xx="局部变量xx"; alert(xx);//弹出"局部变量xx" alert(z);//弹出"局部变量z" } innerfunction(); alert(xx)//无法弹出 } myfunction(); alert(m);//弹出"全局变量m" </script>
以上代码中,进行了函数的嵌套,也就是实现了作用域的嵌套。运行结果这里就不一一介绍了,和上面原理是一样的,需要特别说明的是,alert(xx)之所以不能够弹出内容,因为xx变量的作用域是innerfunction()函数,并且在myfunction()函数和全局作用都没有关于xx变量的声明。
经过上面的几个实例以后,对作用域有了初步的了解,下面再来介绍一下javascript的变量的查找机制,就能明白为什么看起来同名的局部变量能够覆盖全局变量。
以实例三作为一个例子,innerfunction()函数的alert(z)语句,这个时候就首先在innerfunction()函数作用域内查找,如果不存在,则向上在myfunction()函数作用域中查找,如果有就弹出变量值,没有则继续向上查找,如此则形成了一个作用域链。
特别说明:在javascript中不具有块级作用域,例如for循环语句不能形成一个作用。
最原始地址是:http://www.softwhy.com/