javascript嵌套函數(shù)和在函數(shù)內(nèi)調(diào)用外部函數(shù)的區(qū)別分析
我們都知道在函數(shù)中定義的局部變量在聲明他的函數(shù)體以及其嵌套的函數(shù)內(nèi)始終是有定義的,并且在函數(shù)的作用域鏈上始終會(huì)有個(gè)對(duì)象指向全局對(duì)象,使函數(shù)能夠訪問到全局變量。
var ga = 'global'; var func = function() { var la = 'local'; return function() { return function() { return function() { alert(la);alert(ga); } } } } a = func(); a()()();// 彈出 local 和 global
那么在外部定義的函數(shù)A, 被函數(shù)B在函數(shù)體內(nèi)調(diào)用時(shí),A能訪問到B中定義的局部變量嗎?答案是否定的,把上面的例子稍作修改如下
var ga = 'global'; function repeat() { alert(la); } var func = function() { var la = 'local'; alert(1); repeat(); alert(2); }; func();
上面的運(yùn)行結(jié)果是只彈出了1,在調(diào)用repeat的時(shí)候,因?yàn)樵L問了未定義變量js解釋器就報(bào)錯(cuò)把程序中斷了。
原因是函數(shù)在定義時(shí)保存了一個(gè)作用域鏈,repeat函數(shù)在外部定義,在他的作用域中并沒有一個(gè)局部變量叫l(wèi)a,繼續(xù)在全局作用域查找也沒找到la所以就會(huì)報(bào)錯(cuò)。
所以嵌套函數(shù)和在函數(shù)內(nèi)嵌套調(diào)用外部函數(shù)還是有很大區(qū)別的。
昨天在回答一個(gè)問題http://chabaoo.cn/article/78958.htm時(shí)引發(fā)的思考,雖然概念我明白,但是當(dāng)時(shí)一直想在函數(shù)內(nèi)部調(diào)用的repeat為什么訪問不到調(diào)用他的函數(shù)的局部變量,今天又翻了下參考資料自己用代碼測(cè)試了一遍。希望這篇文章能幫助到有同樣困惑的朋友。
- 在html中引入外部js文件,并調(diào)用帶參函數(shù)的方法
- HTML頁(yè)面,測(cè)試JS對(duì)C函數(shù)的調(diào)用簡(jiǎn)單實(shí)例
- Angular外部使用js調(diào)用Angular控制器中的函數(shù)方法或變量用法示例
- 基于js里調(diào)用函數(shù)時(shí),函數(shù)名帶括號(hào)和不帶括號(hào)的區(qū)別
- 淺談js中調(diào)用函數(shù)時(shí)加不加括號(hào)的問題
- 超鏈接怎么正確調(diào)用javascript函數(shù)
- JavaScript實(shí)現(xiàn)同時(shí)調(diào)用多個(gè)函數(shù)的方法
- JavaScript函數(shù)的調(diào)用以及參數(shù)傳遞
- 深入學(xué)習(xí) JavaScript中的函數(shù)調(diào)用
相關(guān)文章
JavaScript中英文字符長(zhǎng)度統(tǒng)計(jì)方法示例【按照中文占2個(gè)字符】
這篇文章主要介紹了JavaScript中英文字符長(zhǎng)度統(tǒng)計(jì)方法,涉及javascript針對(duì)中英文字符的匹配與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01JavaScript實(shí)現(xiàn)進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10js常用系統(tǒng)函數(shù)用法實(shí)例分析
這篇文章主要介紹了js常用系統(tǒng)函數(shù)用法,實(shí)例分析了escape、parseInt、parseFloat、isNaN、isFinite等函數(shù)的用法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01JS實(shí)現(xiàn)給對(duì)象動(dòng)態(tài)添加屬性的方法
這篇文章主要介紹了JS實(shí)現(xiàn)給對(duì)象動(dòng)態(tài)添加屬性的方法,涉及JS屬性的遍歷、動(dòng)態(tài)賦值及eval方法的簡(jiǎn)單使用技巧,需要的朋友可以參考下2017-01-01