JS004-JS中的执行上下文与作用域

59 阅读2分钟
  • 变量提升与函数提升

    • 变量提升: 在变量定义语句之前, 就可以访问到这个变量(值为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(全局执行上下文)
  • 作用域与作用域链

    • 作用域: 一块代码区域, 在编码时(例如定义函数时)就确定了, 不会再变化,是静态的

    • 作用域链: 多个嵌套的作用域形成的由内向外的结构, 用于查找变量

    • 作用域链的创建:

      1. 在调用一个函数时,会为这个函数调用创建一个执行上下文,并创建一个作用域链。
      2. 然后arguments和其他命名参数来初始化这个函数的活动对象(函数局部上下文中的包含变量的对象)
      3. 外部函数的活动对象是内部函数作用域链上的第二个对象
      4. 这个作用域链一直向外串起了所有包含函数的活动对象,直到全局执行上下文才终止。
  • 作用域与执行上下文的区别

    • 作用域: 静态的, 编码时就确定了(不是在运行时), 一旦确定就不会变化了
    • 执行上下文: 动态的, 执行代码时动态创建, 当执行结束消失
    • 联系: 执行上下文环境是在对应的作用域中的,上下文环境(对象)从属于所在的作用域。全局上下文环境==>全局作用域,函数上下文环境==>对应的函数使用域。