域解析

作者: sugar_sugar_ya | 来源:发表于2020-02-21 16:49 被阅读0次

    函数变量及作用域

    隐式全局变量:变量没有声明,直接赋值,执行到时,浏览器才会偷偷把变量提升为隐式全局变量

    全局作用域:在函数声明之外的作用域

    预解析:

    1. 所有的变量声明,都会提升到最顶部,但不会提升赋值
    2. 所有的函数声明,都会提升到最顶部,但不会提升函数的调用
    3. 如果同时有多个 var 声明的相同的变量,后面的 var 将被忽略
    4. 如果同时有多个同名的函数,后面的函数将会覆盖前面的函数
    5. 如果声明的变量和声明的函数同名,声明的函数将会覆盖声明的变量

    词法分析3步骤:

    1. 先分析函数形参(默认值为undefined),再分析形参赋值(没有形参的直接忽略此步骤)
    2. 分析函数体中所有的变量声明:
      2.1 如果变量名与形参名相同时,直接忽略var;
      2.2 如果变量名与形参名不同时,就相当于声明了一个变量,如var foo,值为undefined;
    3. 分析函数体中所有的函数声明,
      3.1 如果函数名与变量名相同,函数将作为变量的值;
      3.2 如果函数名与变量名不相同,相当于var 函数名 = function 函数名 () {};

    函数执行过程分为2步:

    1. 词法分析过程;
    2. 执行过程

    栗子1:

    function a(b) {
          console.log(b); 
          function b() {
           console.log(b); 
          }
          b();
        b=1
    }
    a(1);
    

    栗子2:

    function t3(greet) {
          console.log(greet); //?
          var greet = 'hello';
          console.log(greet); //?
          function greet() {
          };
          console.log(greet); //?
    }
    t3(null);
    

    栗子3:

    function test(a, b) {
          console.log(a); 
          console.log(b); 
          var b = 234;
          console.log(b); 
          a = 123;
          console.log(a); 
          function a() {
          }
          var a;
          b = 234;
          var b = function () {
          }
          console.log(a); 
          console.log(b); 
        }
    
    test(1);
    

    知识点补充:

    arguments是一个对应于传递给函数的参数的类数组对象。(可以获取实参)

    function fn(a,b) {
        console.log(arguments);
        console.log(arguments[0]);
        console.log(arguments[0] = 4);
        console.log(a);
    }
    fn(1,2,3);
    

    栗子4:

    a = 100;
    function demo(e) {
        function e() {
        }
        arguments[0] = 2;
        console.log(e);//?
        if (a) {
           var b = 123;
        }
        a = 10;
        var a;
        console.log(b); //?
        f = 123;
        console.log(a); //?
     }
    
     var a;
     demo(1);
     console.log(a); //?
     console.log(f); //?
    

    具名函数中的变量不能用来调用函数

    var a = function b() {
        console.log(123);
    }
    a();//123
    b();报错
    

    相关文章

      网友评论

          本文标题:域解析

          本文链接:https://www.haomeiwen.com/subject/zolcqhtx.html