js作用域,作用域链?

一、作用域

首先我们应该了解什么是作用域(scope),作用域就是我们代码执行的环境,作用域决定了代码块中变量和其他资源的可见性,

在es6之前,js只有全局作用域和函数作用域,后来才有了块级作用域,我们主要讨论es6出现之前的作用域;

二、全局作用域和函数作用域

全局作用域:整个JS执行环境,上下文环境

函数作用域:通过创建一个函数就开辟出了一个局部作用域

变量运行(搜索)机制:

首先看,有没有局部作用域

如果有,查找是不是这个局部作用域定义的变量

如果不是,寻找上一级作用域,直到找到全局作用域

如果全局作用域也找不到这个变量,这个变量就是未定义的 undefined

 案例:

var scope="global";
function fun(){
    console.log(scope);  // undefined // 函数作用域
    var scope="local"
    console.log(scope);  // local   
}
console.log('global');   // global   // 全局作用域
fun();

 三、块级作用域

块级作用域:块级作用域可通过新增命令 let 和 const 声明,所声明的变量在指定块的作用域外无法被访;

我们经常用到的就是块级作用域,

四、作用域链

1、自由变量:当前作用域没有定义的变量;

2、作用域链:就是寻找变量在作用域中的取值,如果当前作用于没有就会在向父级作用域查找,查找过程中形成的链条叫做作用域链;

var a = 100
function F1() {
    var b = 200
    function F2() {
        var c = 300
        console.log(a) // 自由变量,顺作用域链向父作用域找
        console.log(b) // 自由变量,顺作用域链向父作用域找
        console.log(c) // 本作用域的变量
    }
    F2()
}
F1()

 

posted @ 2021-02-01 23:19  程序員劝退师  阅读(66)  评论(0编辑  收藏  举报