听了小野森美的作用域链,收获颇丰。函数声明时会在js内部创建一个隐式属性[[scope]],保存当前作用域链,默认第一个是GO。函数执行时,会创建自己的AO,保存在作用域链的第一位,之前保存的作用域在后排。函数执行完后,会销毁自己的AO。如果AO还保存在其他函数的范围内,则不会被销毁。再次执行该函数时,将重新创建AO。函数a(){函数b(){varb=2;}变量a=1;b();}varc=3;a();程序执行时,定义函数a,系统生成[[scope]]属性,[[scope]]保存函数的作用域链,作用域链的第0位保存GO中的全局上下文当前环境,GO存储全局环境下的所有对象,包括函数a和全局变量c。函数执行前的时刻b函数被定义b函数被执行b函数执行结束a函数执行结束exercisefunctiona(){functionb(){functionc(){}c();}b();}a();//a定义a.[[scope]]->0:G0//a执行a.[[scope]]->0:a-A01:G0//b定义b.[[scope]]->0:a-A01:G0//b实现b.[[scope]]->0:b-A01:a-A02:G0//c定义c。[[scope]]->0:b-A01:a-A02:G0//c执行c.[[scope]]->0:c-A01:b-A02:a-A03:GO//c执行c.[[scope]]->0:b-AO1:a-AO2:GO//b完成b.[[scope]]->0:a-A01:G0//c.[[scope]]X//a被执行a.[[scope]]->0:G0//b.[[scope]]Xclosurefunctiontest1(){functiontest2(){varb=2;安慰。日志(一);}变量a=1;返回测试2;}变种C=3;vartest3=test1();测试();
