网上有很多关于javascript作用域链和闭包的解释说明,但大多数都是风格统一的例子解释,看的多了也就烦了,所以以这篇笔记来梳理自己的理解,如果有觉得不对的,希望可以指出,共勉。
首先说下作用域的问题:
以线段来比喻作用域的初始状态,原始的作用域链就是一个实心点,代表window这个全局环境,这个就是最原始的执行环境
如果在window环境下执行,var a = ‘this is window’ 或者 a = 'this is window',那么a这个变量就隶属于window
因为js中不存在块级语法,所以像条件,循环语句是不能新建一个执行环境的,也就是说下面的定义最后都属于window
1 if(b) { 2 var c; 3 } 4 5 while(d) { 6 var e; 7 } 8 9 for(var f=0; ; ) { 10 var g; 11 }
以上代码不会为因为b和c在if中,所以他们的执行环境变成了,if或者while或者for,他们始终还是属于window
那什么情况下,会改变代码的执行环境? 那就是函数,也只有函数能新建执行环境,包括一般函数,匿名函数等等,只要是函数,就会自动在当前执行环境下新建一个执行环境。
function b(){ // code } function c(){ // code } function d(){ // e in d function e(){ // code } }
以上共新建了4个新的执行环境,可以看成四个点,首先按照顺序 点window—— 点b —— 点c —— 点d ,很明确,b,c,d属于window执行环境下,而且都在window之前,中间的——就带表自己的环境域
点window是看不到点b之前的——(环境域),包括点c和点d的,所以既然看不到也就无法使用,但是,点d却能看到点window的,这就形成了作用域链。
最后 点e在点d中,所以就是 点d —— 点e 这样的一个关系。
未完待续。。。