作用域
作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
局部作用域
变量在函数内声明,变量为局部作用域。
全局变量
一般在window对象中定义的变量为全局变量(自己的认为)。
局部变量
一般在函数内部定义的变量为局部变量。
1.函数外面定义的变量拥有全局作用域
var a = 1;
function fun1(){
var a = 2;
console.log(a); //2
return a;
console.log(a); //不执行
}
console.log(fun1()); //2
console.log(a); //1
运行结果:
2.未定义直接赋值的变量自动声明为拥有全局作用域
var a = 1;
function fun1(){
a = 2;
console.log(a); //2
return a;
console.log(a); //不执行
}
console.log(fun1()); //2
console.log(a); //2
运行结果:
作用域链
我个人认为就是全局作用域中定义了函数,那么函数有作为一个局部作用域,函数中也可以嵌套定义函数,那么又有一个小作用域,那么这就是作用域链。但是函数中嵌套定义函数,存在闭包问题,这里先不说,后面会对闭包进行说明。
1.当执行函数时,总是先从函数内部找寻局部变量。
2.如果内部找不到(函数的局部作用域没有),则会向创建函数的作用域(声明函数的作用域)寻找,依次向上。
运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行的对应的执行上下文都是独一无二的,所以每次调用函数就会创建多次执行上下文,当函数执行完时,它所产生的执行上下文被销毁。
**
作用域链举例
function fn(){}
var a = 1;
fn();
//a 定义时产生的作用域链 --->0 : GO{}
//a 调用时。。。 --->0 : AO{}
// --->0 : GO{}
function fn(){
function fn1(){
}
fn1();
}
fn();
//fn 定义时产生的作用域链 --->0 : GO{}
//fn 调用时。。。 --->0 : fn的AO{}
// --->1 : GO{}
//fn1 定义时产生的作用域链 --->0 : GO{}
// --->1 : fn的AO{}
//fn1 调用时产生的作用域链 --->0 : fn1的AO{}
// --->1 : fn的AO{}
// --->2 : GO{}