[[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的变量时,你就只能在大括号内部使用这一变量。
下面是我画的三张生命周期图