作用域,之前有介绍过,JavaScript无块级作用域,只有函数作用域,简单点说就是JavaScript的作用域就是函数作用域。因为有函数作用域,所以我们有全局作用域和局部作用域的说法。
执行环境是什么?执行环境定义了变量或函数有权访问的其他数据,每个执行环境都有一个与之关联的虚拟的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
简单说就是每一个函数就有一个执行环境,函数里面的变量和函数都要通过这个函数去访问。对于外部环境来说,每一个函数也是一个变量对象。每一个函数都有一个初始化的argument变量。
JavaScript中最大的全局执行环境是window,执行环境要在所有代码执行完毕才会被销毁,而全局执行环境window只有关闭网页或者关闭浏览器才被销毁。
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。
讲的有点抽象了,通过代码或许更直观:
<script>
var a = 5;
function fun1() {
console.log(arguments)
}
</script>
全局作用域window,局部作用域fun1,;全局执行环境window,局部执行环境fun1;window有自己的变量对象,就是window本身,window可以通过这个变量对象去访问变量a和变量对象fun1。
当fun1执行的时候创建了一个作用域链,所以fun1有两个变量对象,一个是自己,一个是全局环境的变量对象window。fun1可以在函数内部访问变量a,因为fun1所在的作用域链可以找到变量a。
再比如:
var a = 5;
function fun1() {
var b = 6;
function fun2() {
var c = 7;
}
}
这段代码有三个执行环境:全局环境window、局部环境fun1、局部环境fun2;
全局环境Window有一个变量a和一个函数fun1;
局部环境fun1有一个变量b和一个函数fun2,但是fun1可以访问全局环境的变量a;
局部环境fun2有一个变量c,但是fun2可以访问fun1环境中的变量b和全局环境的变量a;
这就是作用域链,作用域链中的内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。作用域链中,每一个局部环境都会首先寻找自身环境中的属性和方法,搜索到了就停止寻找,没有找到再向上搜索直到最外层window还搜索不到就报错。
欢迎关注Coding个人笔记 公众号
网友评论