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