作用域浅理解:一般理解指一个变的作用范围
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{}
- 找形参和变量声明,将变量和形参名当做A0对象的属性名,值为undefined
3.实参形参相统一
4.在函数体里面找函数声明值赋予函数体
全局作用域的预编译
1:创建GO对象
2:找形参和变量声明,将变量和形参名当做A0对象的属性名,值为undefined
3:找函数声明,把值赋予函数体