//作用域链 var title ="链条"; function f1(){ console.log("f1"+title); function f2(){ console.log("f2"+title); function f3(){ console.log("f3"+title); } f3();//f3链条 } f2();//f2链条 } f1();//f1链条
定义:
变量在当前环境,内部环境,内部深层环境都其作用的现象形成了一个链条,这个链条就被称为变量的“作用域链”
特点:外部环境变量,可以给内部环境使用
作用域链的作用
1.变量必须“先声明,后使用”
函数可以“先使用,后声明”,原因是函数有预加载过程,本质还是函数声明在前,使用在后
//变量必须"先声明。后使用 " //同名的函数和变量的执行有顺序问题 var getInfo = "school"; getInfo(); //itcast function getInfo(){ console.log("itcast") //Uncaught TypeError: getInfo is not a function }
2.内部环境可以访问外部环境的变量,反之不然
var age = 20; function f1(){ var height =170; console.log(age); //内环境,访问外环境 变量 } f1(); console.log(height);//外环境访问内环境变量(不允许)
3.变量的作用域是声明时决定的,而不是运行时
var food = "milk"; function f1(){ console.log(food); //milk } function f2(){ var food = "brand"; f1(); } f2();
函数是在全局声明的,而调用时在f2内部环境调用的,由此可以发现,变量的作用域是声明的时候决定的,而不是在运行时
活动对象 AO Active Object
1,js代码执行是有环境的
2,该环境定义了其有权访问的其他数据
3,环境有一个与之相关的活动对象AO
4,环境中所有的变量和函数都是活动对象的属性
5,全局环境是最外围的执行环境,活动对象是window对象
6,执行环境中的代码执行完毕后会被销毁
执行环境以及顺序优先级
var height =175; //外部环境变量 function f1() { var height = 165; //外部环境变量 function f2(height) { //形参 var height = 190; console.log(height); function height() { //本环境函数 alert('skdjlks') } } f2(180); } f1();
优先级 内部环境变量》》本环境函数》》》形参》》》 外部环境变量
全局变量和局部变量
全局变量:全局变量 其是活动对象 window的成员信息
局部变量:其在一定范围内可以看做是"全局变量",其在本环境,内部环境,内部深层环境都可以被访问