先对作用域进行一个基本的介绍
- JavaScript的作用域 就是指变量能够访问到的范围
在ES5版本之前,javascript中只有两种作用域:全局作用域 和 函数作用域
-
全局作用域 就是挂载在window对象下的变量
所以在网页的任何位置都可以访问到这个全局变量
并且不用关键字定义的变量也属于全局变量
var num1 = 10; //全局变量
function fn() {
console.log(num1); //10
num1 = 20;
console.log(num1); //20
}
fn();
console.log(num1);//20
-
函数作用域 是在当前函数内部声明的变量
这个变量除了这个函数内部,其他的地方都不可以去访问
function fn() {
var num1 = 10; //局部变量
console.log(num); //10
}
fn();
console.log(num1); // num2 is not defined 报错:找不到 num变量
~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
在SE6版本出现后,就出现了块级作用域
新增了一个let关键词,使用let关键词定义的变量只能在块级作用域中被访问
在JS编码过程中,像for循环、if语句后面的{ ... }这里面所包含的就是块级作用域
console.log(num); // num is not defined
if(true){
let num = 123;
console.log( num ); //123
}
console.log(num); // num is not defined
因为在if语句中使用let定义了num变量,只有if语句的花括号中是属于num变量的块级作用域,所以在其他地方无法找到num变量