1. 什么是作用域
作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。
如下代码:
console.log(fu); //function
console.log(a); //undefined
function print(){
console.log(a) //10
console.log(fu); // function fud的代码块
function fu(){
var b = 20;
console.log(a) //10
function fu2(){
console.log(b); //20
}
fu2();
}
fu();
}
var a = 10;
function fu(){}
print();
当浏览器打开时—> GO{
print : function print(){}
fu : function fu(){}
a : undefind;
}
-
执行第一行代码: consile.loge(fu); // ƒ fu(){}
console.log(a); //undefined -
执行完成后 a = 10;
. print() ---- AO{
fu : function fu(){}
. } -
执行print () :
consile.loge(a); // 10
console.log(fu); //fu里面的代码块
fu() ---- AO{
b : undefined
fu2: function fu2(){}
} -
执行 fu() :
console.log(a); //10
执行完后 b = 20; -
执行 fu2()
console.log(b); // 20
全局作用域
任何地方都能访问到的对象拥有全局作用域。
函数外面定义的变量拥有全局作用域.
未定义直接赋值的变量自动声明为拥有全局作用域.
window对象的属性拥有全局作用.
局部作用域
局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所以在一些地方会把这种作用域成为函数作用域。
如图:
a是函数内部声明并赋值,拥有局部作用域,只能带函数 select 内部使用,在 select 外部使用就会报错,这就是局部作用域的特性,外部无法访问.
作用域链
当声明一个函数时,局部作用域一级一级向上包起来,就是作用域链。
当执行函数时,总是先从函数内部找寻局部变量
如果内部找不到(函数的局部作用域没有),则会向创建函数的作用域(声明函数的作用域)寻找,依次向上