作用域
先来谈谈变量的作用域
变量的作用域无非就是两种:全局变量和局部变量。
全局作用域:
最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的:
<script>
var outerVar = "outer";
function fn(){
console.log(outerVar);
}
fn();//result:outer
</script>
局部作用域:
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的,最常见的例如函数内部
<script>
function fn(){
var innerVar = "inner";
}
fn();
console.log(innerVar);// ReferenceError: innerVar is not defined
</script>
需要注意的是,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
作用域链(Scope Chain)
那什么是作用域链?
当我们在局部作用域中,访问一个变量时,系统首先会在当前作用域中寻找变量var的声明语句,如找到则直接使用。反之,则继续向上一级作用域中寻找var的声明语句,如找到则直接使用,反之,继续向上一级作用域中去寻找…直到全局作用域,如找到则直接使用,如未找到则直接在全局作用域中声明该变量,我们把这种链式查询关系就称之为为作用域链!
// 全局作用域: script标签包裹的内容就是一个作用域
var abc = 123;
// fn 中能访问到的变量由那些:
// 1 自身定义的变量
// 2 上一级作用域中的变量(全局作用域)
// foo 中能访问到的变量由那些:
// 1 自身定义的变量
// 2 函数fn中的变量
// 3 全局作用域中的变量
function fn() {
var a = 456;
function foo() {
var num = 123;
// f的作用域链: f作用域 -> foo作用域 -> fn作用域 -> 全局作用域
function f() {}
}
foo();
// console.log(num);
}
注意
- 函数在执行的过程中,先从自己内部找变量
- 如果找不到,再从创建当前函数所在的作用域去找, 以此往上
- 注意找的是变量的当前的状态
网友评论