鍍金池/ 問(wèn)答/Java  HTML/ 為什么立即執(zhí)行函數(shù)不能在其所在的作用域訪問(wèn)它?

為什么立即執(zhí)行函數(shù)不能在其所在的作用域訪問(wèn)它?

我在看《你不知道的JavaScrpit》中遇到類似這樣一個(gè)例子:

(function foo(){
    console.log('函數(shù)內(nèi)部:'+foo);//打印出這個(gè)函數(shù)體
})();

console.log('函數(shù)外部:'+foo);//報(bào)錯(cuò)。Uncaught ReferenceError: foo is not defined

書(shū)上的解釋是:

foo 被綁定在函數(shù)表達(dá)式自身的函數(shù)中而不是所在作用域中。
換句話說(shuō),(function foo(){……})作為函數(shù)表達(dá)式意味著foo只能在..所代表的位置被訪問(wèn),外部作用域則不行。

我疑問(wèn)的是:
1、為什么foo被綁定在函數(shù)表達(dá)式自身的函數(shù)中?

  • 是語(yǔ)法上本來(lái)就是這樣規(guī)定的還是有其他的解釋?
  • 如果有其他的解釋,那是什么原理呢?

2、foo屬于哪個(gè)作用域?

  • 從位置上看,foo是屬于全局作用域的,但是通過(guò)代碼可以看出在全局作用域中無(wú)法訪問(wèn)。那么,foo是不是就不屬于全局作用域?而是屬于foo函數(shù)作用域,也就是屬于函數(shù)自身的作用域?

希望走過(guò)路過(guò)的大神指點(diǎn)一二!不勝感激?。海?/p>

回答
編輯回答
傲嬌范

(function foo(){console.log('函數(shù)內(nèi)部:'+foo);//打印出這個(gè)函數(shù)體})(); //后面還有對(duì)括號(hào)

(function foo(){...})();這個(gè)是立即執(zhí)行函數(shù)吧,他會(huì)隔絕作用域的。

2018年1月1日 12:01
編輯回答
疚幼
(function foo(){
    console.log('函數(shù)內(nèi)部:'+foo);//打印出這個(gè)函數(shù)體
})();

console.log('函數(shù)外部:'+foo);//報(bào)錯(cuò)。Uncaught ReferenceError: foo is not defined
1、為什么foo被綁定在函數(shù)表達(dá)式自身的函數(shù)中?

首先,你要搞清楚,在下面代碼中,

(function foo(){
        console.log('函數(shù)內(nèi)部:'+foo);//打印出這個(gè)函數(shù)體
    })

函數(shù) foo 是作為函數(shù)表達(dá)式存在的,不是函數(shù)聲明語(yǔ)句,為什么呢?因?yàn)橛?code>(),()把里面的函數(shù)聲明語(yǔ)句變成了函數(shù)表達(dá)式,或者嚴(yán)謹(jǐn)些,解析器去解析的時(shí)候,會(huì)把()里的當(dāng)做表達(dá)式去解析,所以函數(shù) foo 是作為函數(shù)表達(dá)式存在的;

當(dāng)函數(shù)作為表達(dá)式來(lái)用的時(shí)候,函數(shù)可以有名稱,在這里就是 foo,但是這個(gè)函數(shù)名只存在于函數(shù)體內(nèi),是局部變量,指代函數(shù)本身;如圖:js-權(quán)威指南上的話:

clipboard.png

規(guī)范是這么說(shuō)的:

clipboard.png

2、foo屬于哪個(gè)作用域?

按照前面的解釋,foo 是局部變量,只存在于函數(shù)體內(nèi),并不在全局作用域內(nèi);

但是他跟函數(shù)里聲明的局部變量又不太一樣,這個(gè)我沒(méi)有去搞清楚,暫時(shí)不影響理解;

2018年8月22日 22:06