/*全局作用域
1.全局作用域在页面打开时被创建,页面关闭时被销毁
2.编写在script标签中的变量和函数,作用域为全局,在页面的任意位置都可以访问到
3.在全局作用域中,有全局对象Windows,代表一个浏览器窗口,有浏览器创建,可以直接调用
4.全局作用域中声明的变量和函数会作为windows对象的属性和方法保存
*/
/*函数的作用域
1.调用函数时,函数作用域被创建,函数执行完毕,函数作用域被销毁
2.每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立
3.在函数作用域中可以访问到全局作用域中的变量,在函数歪的变量无法访问到函数作用域中的变量
4.在函数作用域中访问变量、函数时,会先在自身作用域中寻找,若没有,则会到函数的上一级作用域寻找,一直到全局作用域
*/
/* 函数作用域的深层理解
- 当函数执行代码的前期,会创建一个执行期的上下文的内部对象 AO (作用域)
- 这个内部对象是预编译的时候创建出来的,应为当函数被调用时,会先进行预编译
= 在全局代码执行的前期,会创建一个执行期的上下文的对象 GO
*/
/* 函数作用域的预编译
1.创建AO对象 AO{}
2.找形参和变量声明,将变量和形参名当做AO对象的属性名,值为undefined
3.实参形参相统一
4.在函数体里找函数声明,值赋予函数体
*/
/* 全局作用域的预编译
1.创建GO对象
2.找变量声明,将变量名作为GO对象的属性名,值为undefined
3.找函数声明 赋值于函数体
*/
1 <!-- 2 * @Author: your TM_cc 3 * @Date: 2021-11-01 15:04:53 4 * @LastEditTime: 2021-11-01 18:43:26 5 * @LastEditors: Please set LastEditors 6 * @Description: In User Settings Edit 7 * @FilePath: \作用域.html 8 --> 9 <!DOCTYPE html> 10 <html lang="en"> 11 <head> 12 <meta charset="UTF-8"> 13 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 14 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 15 <title>作用域</title> 16 </head> 17 <body> 18 <script> 19 function fn(a,c){ 20 console.log(a) // function a() {} 21 var a = 123 22 console.log(a) // 123 23 console.log(c) // function c() {} 24 function a() {} 25 if (flase){ 26 var d = 456 27 } 28 console.log(d) // undefined 29 console.log(b) // undefined 30 var b = function () {} //函数的表达式 31 console.log(b) // function () {} 32 function c() {} 33 console.log(c) // function () {} 34 } 35 fn(1,2) 36 /* 37 1.创建AO对象 38 AO:{ - 2.找变量声明 值为undefined 39 - 3.找函数声明并赋值 40 a:undefined 1 function a() {} 同名覆盖变量申明 41 c:undefined 2 function c() {} 同名覆盖变量申明 42 b:undefined 43 d:undefined 44 } */ 45 46 47 /* 作用域链 48 - 会被保存到一个隐式的属性中去 [[scope]] 这个属性是用户访问不到的,蛋壳已让js引擎来访问;里面储存的就是作用域链 49 - 函数只有在执行的时候才有AO 50 */ 51 </script> 52 </body> 53 </html>