JS的作用域

144 阅读2分钟

作用域说明:一般理解指一个变量的作用范围

全局作用域:

  1. 全局作用句在页面打开时被创建,页面关闭时被销毁;
  2. 编写在script标签中的变量和函数,作用域在全局,在页面的任意位置都可以访问到;
  3. 在全局作用域中有全局对象window,代表一个浏览器窗口,由浏览器创建,可以直接调用;
  4. 全局作用域中声明的变量和函数会作为window对象的属性和方法保存

函数作用域:

  1. 调用函数时,函数作用域被创建,函数执行完毕,函数作用域被销毁;
  2. 每调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的;
  3. 在函数作用域中可以访问到全局作用域的变量,在函数外无法访问到函数作用域内的变量;
  4. 在函数作用域中访问变量/函数时,先回在自身作用域中寻找,若没有找到,则会到函数的上一级作用寻找,一直到全局作用域; 作用域的深层次理解
  • 执行器的上下文
    • 当函数代码执行的前期,会创建一个执行器上下文的内部对象AO(作用域);
    • 在这个内部的对象时预编译的时候创建出来的,因为当函数被调用的时候 会先进行预编译;
    • 在全局代码执行的前期会创建一个执行期的上下文的对象GO.
    • 这里有关JS的预编译也简单提一下 函数作用域预编译
  1. 创建AO对象AO{};
  2. 找形参和变量声明,将变量和形参名当作AO对象的属性名,值为undefined;
  3. 实参形参相统一;
  4. 在函数体里面找函数声明,值赋予函数体 全局作用域的预编译
  5. 创建GO对象
  6. 找变量声明,将变量名作为GO对象的属性名,值为undefined
  7. 找函数声明,值赋予函数体