每个函数都是一个对象,对象中有些属性可以访问,但有些不可以,[[scope]]就是其中之一。
[[scope]]指的就是我们所说的作用域,其中存储了执行期上下文的集合。
作用域链:[[scope]]所存储的执行期上下文对象的集合。
执行期上下文
当函数执行时,会创建一个称为执行期上下文的内部对象。每一个函数的执行期上下文都是独一无二的,当函数执行完毕会销毁。
一个函数执行时,[[scope]]相当于一个数组,第一位是AO,第二位是GO。
当一个函数被定义时,[[scope]]里面已经存有GO。执行时形成AO放在GO之前执行。
简而言之,先执行AO再执行GO且每个函数执行都会有一个AO
函数嵌套从内到外引用。
function a ( ){
function b (){
var b =234;
a = 0;
console.log(a);
}
var a =123;
b();
console.log(a);
}
var glob =100;
a();
b函数中改变a 的值,在b函数执行后,a的值也被改变。
function a ( ){
function b (){
var b =234;
var a = 0;
console.log(a);
}
var a =123;
b();
console.log(a);
}
var glob =100;
a();
但如果在b函数中声明a变量,则a函数中的a的值为123.