深入理解JS作用域

关于深入理解JS作用域的一些笔记

//全局作用域   函数作用域
    // var a = 2;
    //
    // console.log(a);
    function f() {
        var b = 3;
        //  console.log(a);
    }

    // console.log(b);

    //编译阶段  边解释边执行

    //内部原理分成  编译,执行,查询,嵌套,异常(了解)

    //1.编译 2.执行 3.查询 4.嵌套 5.异常
    var a = 2;
    //1.1分词
    //词法单元   var,a,=,2,;
    /*
    数组或对象
      {
        "var":"keyword",//关键字
        "a":"indentifier",//标识符
        "=":"assignment",//分配
        "2":"interger",//整数
        ";":"eos",//(end of statement)结束语句
      }

    */

    //1.2解析
    //抽象语法数(AST  Abstract Snatax Tree)

    //1.3代码生成
    //将AST换成可以执行代码的过程,转换成一组机器的指令
    //简言之,编译过程就是编译器把程序分解成词法单元,将词法单元解析成AST,再把AST转换成机器指令等待执行的过程

    var a = 2;

    //执行阶段
    //1.引擎运行代码时首先查找当前的作用域下,如果是引擎就会直接使用这个变量:如果否,引擎就会继续查找变量
    //2.如果找到了变量,就会将2赋值给当前的变量,否则引擎就会抛出异常

    //查询阶段   LSH查询=  RHS查询   L寻址R寻值
    var a=2;//LSH查询

    function f1(a) {//RHS查询
       // console.log(a);
    }
    f1(2);
    //1.f1()对于f1函数对象进行RHS引用
    //2.函数传参a=2对a进行了LHS引用
    //3.console.log(a);对console对象进行RHS引用,并检查其是否有log()方法
    //4.console.log(a);对a进行RHS引用,并把得到的值传给了console.log(a);

    //嵌套阶段
    //作用域变量的查找机制(**********重要*******)
    //在当前作用域中无法找到某个变量时,引擎就会在最外层嵌套作用域中继续查找你,
    //直到找到该变量,或者是抵达最外层的作用域(全局作用域)为止
    function f2(a) {
        function f3() {
           // console.log(a+b);
        }
        f3();
    }
    var b=2;
    f2(4);

    //异常阶段

    function f3(a) {
        // a=c;//c is not defined
        // b();//b is not a function
        // "use strict";
        c=1;
    }
    f3(3);
    // console.log(c);

    // 词法作用域

    function f4(q) {
        var b=q*2;
        function f5(c) {
          //  console.log(q,b,c);//2,4,12
        }
        f5(b*3);
    }
    f4(2);

    //预解释  变量声明提升   var
    a=2;
    var a;
    //console.log(a);

    //console.log(aaa);//undefined
    var aaa=6;
    //函数声明提升
    adr();
    function adr() {
        // console.log(1);
    }
    // ade();
    var ade=function () {
        // console.log(1);
    }

    //声明  :变量声明提升和函数声明提升  函数的声明优先于变量声明提升;注意未定义的同名变量会被覆盖
    var aqq;
    function aqq(){}
    // console.log(aqq);
    aqq=10;
    // console.log(aqq);
    //变量的重复声明是无用的,但是函数的重复声明会被覆盖前面的声明(无论是变量还是函数声明,重复情况下)

    //注意:应该避免在同一作用域中重复声明

    var a=1;
    var b=2;
    function ff(x) {
        var a=10;
        function bar(x) {
            var a=100;
            b=x+a;
            return b;

        }
        bar(20);
        bar(200);
    }
    ff(0);
    console.log(a,b);

    //总结:执行环境 相当于作用域链一样
    //在JS中,除了全局作用域,每个函数都会创建自己的作用域。
    //作用域在函数定义的时候已经确定了,与函数调用无关
    //通过作用域,可以查找作用域范围内的变量和函数有哪些,却不知道变量的值是什么。所以作用域是静态
    //对于函数来说,执行环境在函数调用时确定的。执行环境包含作用域内的所有的变量和函数的值。
    //在同一个人作用域下,不同的调用会产生不用的执行环境,从而产生不同的变量和值。所以执行环境是动态

本文是学习文档视频敲出来的笔记小马哥的JS文档

不安逸,不浮躁,牛B就是一个学习累积的过程。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值