每天进步一点点

变量提升

  • 变量提升:是指js代码执行过程中,js引擎把变量的声明和函数的声明提升到代码的开头的“行为”。
  • 变量和函数在代码里的位置是不会变的,而是在编译阶段被js引擎放入内存中。
  • 变量提升后,会给变量设置默认值,undefined。
  • 带来的问题
    • 变量会被覆盖
        foo()   // foo2
        function foo() { console.log('foo1') }
        function foo() { console.log('foo2') }
      
    • 应该销毁但没有销毁
      function foo() {
         for(var i = 0;i < 10;i++) {}
         console.log(i)  //10
      }
      foo()
    

执行上下文

  • 执行上下文是js执行一段代码时的运行环境
  • 执行上下文的种类
    • 全局执行上下文(在整个页面的生存周期内)
    • 函数执行上下文(调用一个函数的时候,函数体里面的代码被编译,会创建函数执行上下文,函数执行结束,会销毁(一般情况下))
    • eval执行上下文(用的很少)

调用栈

  • 用来管理函数调用关系的ds

作用域

  • 作用域:在程序中定义变量的区域,该区域决定了变量的声明周期
  • 人话: 变量和函数的可访问范围
  • 作用域控制变量和函数的可见性和声明周期
  • 种类:
    • 全局作用域 : 代码中任何地方都可以访问到这个作用域。生命周期最长
    • 函数作用域 : 函数内部定义的变量或函数,并且定义的变量或函数只能在函数内部访问,函数执行结束后,会被销毁。
    • 块级作用域 : 作用块内声明的变量不影响块外面的变量(let 和 const 都可以形成块级作用域 )。
      • e.g
        function foo() {
            var a = 1;
            let b = 2;
            {
               let b = 3;
               var c = 4;
               let d = 5;
               console.log(a);
               console.log(b);      
            }
            console.log(b);
            console.log(c);
            console.log(d);
        }
        foo()
      
      • var 声明的 ,会被放到变量环境里面(es6) es3 放到变量对象里
      • let 声明的, 会被放到词法环境中
      • 在函数的作用域内部,通过let声明的变量并没有被存放到词法环境中
posted on 2021-10-25 15:42  柯蓝僧人  阅读(57)  评论(0编辑  收藏  举报