如下代碼:(functionA(){console.log(A);//[FunctionA]A=1;console.log(window.A);//undefinedconsole.log(A);//[FunctionA]}())可以看到注釋里的輸出。這也就是說A=1這一步什么都沒有發(fā)生。它既沒有改變A的值,也沒有在window中添加新的屬性。而如下代碼:(functionA(){console.log(A);//undefinedvarA=1;console.log(window.A);//undefinedconsole.log(A);//1}())這個還是很好理解的,var語句被hoist到函數(shù)頂端,函數(shù)內(nèi)定義了變量A但是沒有賦值,所以第一個log是undefined,因?yàn)橛衯ar,并沒有向global添加屬性,因此window.A也是undefined。接著,functionA(){console.log(A);//[FunctionA]A=1;console.log(window.A);//1console.log(A);//1}A();不在立即執(zhí)行這個函數(shù),結(jié)果也很符合直覺,打第一個log時,函數(shù)作用域內(nèi)沒有找到A,因此向上層查找,找到函數(shù)A;然后A=1使得window對象多了一個屬性,第二個log結(jié)果是1,第三個log顯然也是1。那么問題來了,第一段代碼里,A=1到底做了什么呢?
在JavaScript的立即執(zhí)行的具名函數(shù)A內(nèi)修改A的值時到底發(fā)生了什么?
一只萌萌小番薯
2019-04-21 20:37:59