[[scope]]:每个javascript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供javascript引擎存取,[[scope]]就是其中一个。[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。即作用域决定了代码区块中变量和其他资源的可见性。

全局作用域:全局作用域贯穿整个javascript文档,在所有函数声明或者大括号之外定义的变量,都在全局作用域里。一旦你声明了一个全局变量,那么你在任何地方都可以使用它,包括函数内部。

var num = 10;
		test(1);
		var test = 123;
		console.log(test);//123
		console.log(num);//11
		console.log(global);//undefined
		var global = 100;
		function fn(){
			console.log(global);//100
			global = 200;
		}
		console.log(global);//100
		fn();
		var fn;
		console.log(global);//200
		fn = 10;
		console.log(fn);//10

//1  GO{}创建GO作用域进行预编译
//2  GO{
//查找GO里面用var关键字和函数创建的变量
//	global : undefiend,
//	fn : undefiend,
//}
//3 GO{
//将实参值和形参统一
//	global : undefiend,
//	fn : undefiend,
//}
//4 GO{
//在函数中找函数声明,值赋予函数体
//	global : undefiend,
//	fn : function fn(){
//			console.log(global);//100
//			global = 200;
//		},
//}
//GO{执行
//	global : 200,
//	fn : 10,
//}
//fn AO出现
{
	//里面没有变量
}

局部作用域:局部作用域一般只在固定的代码片段内可访问到,而其外部是无法访问的,它分为函数作用域和块级作用域
函数作用域: 当你在函数里定义一个变量时,它在函数内任何地方都可以使用。在函数之外,你就无法访问它了。

//例子:
		
		function num(a,b){
			console.log(a);//function
			function a(){};
			console.log(b);//function
			var a = 20;
			b = 30;
			function b(){};
			console.log(a);//20
			console.log(b);//30
		}
		num(1,2);
		
		//JS运行的步骤
		// 1、语法分析  
		// 2、预编译
		// 3、解释执行
		//函数声明整体提前,变量  声明提前
		// 作用域  全局window(Global Object)   局部作用 (AO  Activation Object)
		
		//  1,AO {在函数执行之前会创建AO进行预编译
		//先找出函数中用var关键字和function关键字创建的变量和函数
		//var关键字声明的变量声明提前值不提前
		//function声明的函数是整体提前
		// a : undefined  
		// b : undefined
		// }
		// 2,AO {
		//将实参值和形参统一
		// 	a : 1 
		// 	b : 2
		// }
		// 3,AO {
		//在函数中找函数声明,值赋予函数体
		// 	a : function a(){}
		// 	b : function b(){}
		// }
		// 4,执行{
		// 	a : function a(){}  20
		// 	b : function b(){}  30

		// }

块级作用域:你在使用大括号时,声明了一个const或者let的变量时,你就只能在大括号内部使用这一变量。

下面是我画的三张生命周期图

javascript 全局对象及方法 javascript全局函数_大括号

javascript 全局对象及方法 javascript全局函数_大括号_02


javascript 全局对象及方法 javascript全局函数_作用域_03