在Chrome中實驗以下代碼:function f(){ console.log("outside f()");}+function (){ if(false){ function f(){ console.log("inside f()"); } } f(); // Uncaught TypeError: f is not a function}();在外部定義函數f,它輸出"outside f()",而在之后的IIFE中也定義了一個f,然后執行這個f函數,但是輸出Uncaught TypeError: f is not a function。但是,如果我把if條件改為true,則會輸出inside f()。我注意到,這個異常是TypeError類型錯誤,這說明它確實找到了f這個變量,但是它不是一個函數類型,這似乎表明在這個IIFE作用域中已經存在一個f變量,它屏蔽了外部的f函數。我不明白這個機制到底是怎么回事。不是說函數和變量會有一個提升過程嗎?此時無論if語句是什么,內部的f應該是能找到才對,再不濟還可以按照作用域鏈上尋查找到外部定義的f函數呀?此時內部莫名其妙多出一個名為f、值是undefined的變量是怎么回事?可以說在代碼塊中定義一個函數,就會多出一個與這個函數名相同的一個變量嗎?如果是變量提升我還能理解,函數提升我也能理解,但是函數卻以變量形式提升我就有點不明白了。
JavaScript中為什么找不到條件語句中定義的函數
慕桂英3389331
2018-12-21 19:19:48