慕田峪9158850
2018-08-03 13:25:08
一個自執行的匿名函數代碼如下: var a = 'World!'; (function () { console.log(window.a); //world; console.log(a) //undefined; if (typeof a=== 'undefined') { var a= 'Jack'; console.log('Goodbye ' + a); } else { console.log('Hello ' + a); } })(); console.log(a)在js中沒有塊級的概念,函數里可以訪問到函數外的全局變量,但函數外卻無法訪問函數里面的局部變量,按照這樣理解為什么在自執行的匿名函數里面無法訪問到a,而使用window.a卻可以訪問到,根據作用域鏈的查找來看,他不應該可以往上查找到a嗎?為什么要window.a行?在匿名函數里面打印this的值也是window來著,他和匿名函數外是同一個this之下吧,就有點說不通為什么在匿名函數里面直接訪問a會是undefined。。。誰能解釋一下匿名函數中的作用域鏈查找的過程??!
2 回答

德瑪西亞99
TA貢獻1770條經驗 獲得超3個贊
var a = 'World!';
(function () {
console.log(window.a); //world;
console.log(a) //world;
})();
console.log(a);
這個是正常的, 問題出在var a= 'Jack';
Javascript 有一個規則叫變量提升
, 收這個規則的影響實際上你的代碼變成了這樣:
var a = 'World!';
(function () {
var a; // var 聲明的變量會被自動的提升到作用域的頂端,這就導致 if 條件拿到的 a 的值是 undifined
console.log(window.a); //world;
console.log(a) //undefined;
if (typeof a=== 'undefined') {
a= 'Jack';
console.log('Goodbye ' + a);
} else {
console.log('Hello ' + a);
}
})();
console.log(a)
添加回答
舉報
0/150
提交
取消