js的作用域最全解析

166 阅读2分钟

作用域浅理解:一般理解指一个变的作用范围

1.全局作用域

(1) 全局作用域在页面打开时被创建,页面关闭时被销毁

(2) 编写在script标签中的变量和函数,作用域为全局,在页面的任意位置都可以访问到

(3) 在全局作用域中有全局对象window,代表个浏览 器窗口,由浏览器创建,可以直接调用

(4) 全局作用域中声明的变和函数会作为window对象的属性和方法保存

2.函数作用域

(1) 调用函数时,函数作用域被创建函数执行完毕,函数作用域被销毁

(2) 每调用次函数就会创建一个新的函数作用域,他们之间是相互独立的

(3) 在函数作用域中可以访问到全局作用域的变量,在函数外无法访问到函数作用域内的变量

(4) 在函数作用域中访问变量、函数时,会先在自身作用域中寻找,若没有找到,则会到函数的上一级作用域中寻找,一直到全局作用域

作用域的深层次理解

执行期的上下文

1: 当函数代码执行的前期,会创建一个执行期上下文的内部对象AO(作用域)

2: 这个内部的对象AO(作用域)是预编译的时候创建出来的,因为当函数被调用的时候,会先进行预编译

3: 在全局代码执行的前期会创建一个执行期的上下文的对象G0

function fn(a, c) {
    console.log(a); //1
    var a = 123;
    console.log(a); //1
    console.log(c); //1
    function a() {}
    if (false) {
        var d = 678
    }
    console.log(d); //1
    console.log(b); //1
    var b = function () {}
    console.log(b); //1
    function c() {}
    console.log(c); //100
}
fn(1, 2);

把源代码预解析

ao:{
a:underfined  1    function a() {}
c:underfined  2    function c() {}
d:underfined
b:underfined
}

这里有关js的预编译也简单的提一下

函数作用域预编译

1.创建ao对象A0{}

  1. 找形参和变量声明,将变量和形参名当做A0对象的属性名,值为undefined

3.实参形参相统一

4.在函数体里面找函数声明值赋予函数体

全局作用域的预编译

1:创建GO对象

2:找形参和变量声明,将变量和形参名当做A0对象的属性名,值为undefined

3:找函数声明,把值赋予函数体