-
变量提升与函数提升
-
变量提升: 在变量定义语句之前, 就可以访问到这个变量(值为undefined)
-
函数声明提升: 函数声明会在任何代码执行之前先被读取并添加到执行上下文。在函数定义语句之前, 就可以调用该函数
-
函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被变量赋值后覆盖
-
console.log(man); //undefined
var man = 'Tony';
console.log(fun) // ƒ fun() {console.log('good');}
fun(); //good
function fun() {
console.log('good');
}
var fun;
console.log(fun); // ƒ fun() {console.log('good');}
fun = 'cover';
console.log(fun); //cover
-
执行上下文:
- 分为全局执行上下文、函数执行上下文、eval()调用内部的第三种上下文
- 是在对应代码执行之前动态创建的。全局执行上下文在页面刷新/关闭/退出浏览器时死亡(销毁)。函数执行上下文在函数执行完时销毁
- 内部执行上下文(下级上下文)可以通过作用域链访问外部上下文(上级上下文)中的一切,外部(上级)不可以访问内部(下级)的任何东西
- 执行上下文栈:在全局代码执行前, JS引擎就会创建一个栈来存储管理所有的执行上下文对象,当所有的代码执行完后, 栈中只剩下window(全局执行上下文)
-
作用域与作用域链
-
作用域: 一块代码区域, 在编码时(例如定义函数时)就确定了, 不会再变化,是静态的
-
作用域链: 多个嵌套的作用域形成的由内向外的结构, 用于查找变量
-
作用域链的创建:
- 在调用一个函数时,会为这个函数调用创建一个执行上下文,并创建一个作用域链。
- 然后arguments和其他命名参数来初始化这个函数的活动对象(函数局部上下文中的包含变量的对象)
- 外部函数的活动对象是内部函数作用域链上的第二个对象
- 这个作用域链一直向外串起了所有包含函数的活动对象,直到全局执行上下文才终止。
-
-
作用域与执行上下文的区别
- 作用域: 静态的, 编码时就确定了(不是在运行时), 一旦确定就不会变化了
- 执行上下文: 动态的, 执行代码时动态创建, 当执行结束消失
- 联系: 执行上下文环境是在对应的作用域中的,上下文环境(对象)从属于所在的作用域。全局上下文环境==>全局作用域,函数上下文环境==>对应的函数使用域。