Javascript中的作用域

124 阅读3分钟

js中的作用域指的就是变量的可作用范围,变量只在自己的作用域下生效,函数会产生作用域,函数内定义的变量只能在函数内使用,外层作用域无法访问函数内部变量. js中的作用于分为:

全局作用域:

在函数外面定义的变量的作用域就是全局作用域,全局变量在哪里都可以访问.

局部作用域:

在函数内定义的变量和形参的作用域就是局部作用域,这样的变量称为局部变量.

块级作用域:

在代码块中使用es6新增的let和const定义的变量的作用域就是块级作用域,这样的变量称之为块级变量

堆栈了解

image.png 栈内存主要是用来存放值类型的数据,函数的执行也会在这里面执行,函数执行会创造私有执行上下文. ,函数的执行会在栈内存中开辟私有执行上下文EC(function),私有上下文中的AO用来存储函数中的私有变量和形参,而EC(g)中的vo中存储的是使用let和const声明的全局变量,在es6之前使用var关键字声明,会放在window全局对象当中.

函数的作用域在函数定义的那一刻就注定了,其作用域只和在哪里定义有关,和在哪里调用无关.

 var a = 100; //var 声明的全局作用域变量  会挂在window上+
    let b = 20; // let  const 声明的全局作用域变量  不会挂在window上

    function fn() {
        let a = 99;
        n = 66;
        var bb = 88;
        function Fn() {
            let a = 30; //1.隔离变量  不同作用域的变量名可以相等
            //函数 的嵌套函数  可以访问上层变量  函数内的嵌套函数与外层函数不在同一执行上下文
            console.log(a, '当前作用域的变量', b, '全局变量', n, '上层作用域不通过关键字声明变量', bb, '当前内部嵌套变量--上层作用域变量');
        }
    }
    fn()
    
    在函数内不通过关键字直接给未声明变量赋值也会被挂在window,是一个全局变量
   var a = 1; //此处的a为全局变量

    function fn() {
        let b = 2; //此处的b为局部变量,外部不可访问

        function fn2() {
            console.log(a + b);//这里的a是全局变量,b是局部变量
        };
        fn2();
    };
    fn();

作用域链

1.函数会限制变量的作用域范围,而函数内是可以嵌套函数的,函数的层层嵌套,就形成了作用域链

2.作用域链描述的是程序在执行过程当中寻找变量的过程

作用域链查找变量的过程

当函数使用变量时会按照如下过程去查找变量

(1)先从自身作用域去查找,如果没有就往上级作用域查找,知道查找到全局作用域当中

(2)如果其中有找到,就会停止向上查找,直接使用.

(3)如果直到全局都没有找到,则会报引用错误或变量未定义