学习理解JavaScript 作用域和作用域链
前言:今天晚上学习了JavaScript的全局作用域和局部作用域,以及全局变量和局部变量,以及ES6新特性块级作用域,还有作用域链的学习,现将理解如下
1、什么是作用域
作用域是代码运行中的变量,函数,对象可访问性,与之对应的变量称为全局变量或者局部变量,分别代表者可以在程序的代码范围使用,这个代码范围就是作用域。作用域提高了程序逻辑的可靠性和局部性,减少了变量的冲突。作用域限定了变量的范围,不同作用域下即使变量名称一致也不会产生冲突。
var num = 10; //最外层变量,作用于全局 console.log(num);//这里输出的是全局变量,值等于10 function fn() { //最外层函数 var num = 20; function innerFn() { //内层函数 console.log(num); } innerFn(); } fn();
这是外层输出全局变量值为10,内层函数的输出变量为20
- 所有末定义直接赋值的变量自动声明为拥有全局作用域
- 所有 window 对象的属性拥有全局作用域
2、全局变量和局部变量
全部变量和局部变量意味着变量的作用域不同,作用于代码的范围不同。
3、作用域链
作用域是分层的,内层作用域可以访问外层作用域的变量,反之则不行。也就是说内部函数可以访问上一级的变量,外部函数则不可以访问内部函数的变量,变量访问采取向上就近原则!
var num = 10; //最高作用域,视为零级作用域 console.log(num); //这里输出的是全局变量,值等于10 function fn() {//外层函数,视为一级作用域 var num = 20; function innerFn() {//内层函数,视为二级作用域,可以访问上一级变量 console.log(num); } innerFn(); } fn();
4、ES6新特性块级作用域
块级作用域可通过新增命令 let 和 const 声明,所声明的变量在指定块的作用域外无法被访问。块级作用域在如下情况被创建:
- 在一个函数内部
- 在一个代码块内部
function fn(num) { if (num) { let nums = 10; return nums; } else { // nums 只作用于上级{}在此处不可用 return null; } // nums 在此处也不可用 }

浙公网安备 33010602011771号