学习理解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 声明,所声明的变量在指定块的作用域外无法被访问。块级作用域在如下情况被创建:

  1. 在一个函数内部
  2. 在一个代码块内部
function fn(num) {
    if (num) {
        let nums = 10;
        return nums;
    } else {
        // nums 只作用于上级{}在此处不可用
        return null;
    }
    // nums 在此处也不可用
}

 

posted @ 2021-03-02 03:12  撞倒树的兔子  阅读(25)  评论(0)    收藏  举报