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