概念
作用域就是变量的作用范围。因此讲作用域之前必须先讲变量。
变量
在很多编程语言中变量都有全局变量,局部变量的概念,JS中也是这样。JS中全局变量和局部变量的区别在于变量的定义位置不同,定义在函数之外的为全局变量;定义在函数内的为局部变量。
<script>
// 全局变量
var name = "magic";
// 隐式全局变量
age = "2N";
function f() {
// 局部变量
var temp = "magicPig";
}
</script>
全局变量在函数内外都可以访问,局部变量只能在函数内使用,函数执行完该变量被回收。当声明全局变量的时候,如果省略掉关键字var,则该变量为隐式全局变量,不管该变量是否声明在了函数内部和外部。
作用域
因为变量分为全局变量和局部变量,所以作用域分为全局作用域和局部作用域。
全局作用域:全局变量的使用范围,全局变量可以在script标签内部任何位置使用,所以全局作用域空间为整个script标签内部。
局部作用域:局部变量的使用范围,局部变量可以在函数体使用,所以局部作用域空间为整个函数体。
// 全局变量
var name = "magic";
function f() {
console.log(name);
}
console.log(name); // magic
f();// magic
function f() {
// 局部变量
var temp = "magic";
console.log(temp);
}
f();// magic
console.log(temp); // 报错
作用域链
某个变量,如果有多个作用域产生交叉,这些作用域形成作用域链。
var temp = "temp0";
function f() {
console.log(temp);
temp = "temp1";
f1();
function f1() {
console.log(temp);
temp = "temp2";
f2();
function f2() {
console.log(temp);
}
}
}
f();
// temp0
// temp1
// temp2
由上图可以推断出来作用域链,比较简单不在赘述。
没有效率的生活,就是对生命的亵渎。