变量提升
- 变量提升:是指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声明的变量并没有被存放到词法环境中