摘要:昨天在回答一個(gè)問題時(shí)引發(fā)的思考,雖然概念我明白,但是當(dāng)時(shí)一直想在函數(shù)內(nèi)部調(diào)用的為什么訪問不到調(diào)用他的函數(shù)的局部變量,今天又翻了下參考資料自己用代碼測試了一遍。
我們都知道在函數(shù)中定義的局部變量在聲明他的函數(shù)體以及其嵌套的函數(shù)內(nèi)始終是有定義的,并且在函數(shù)的作用域鏈上始終會(huì)有個(gè)對象指向全局對象,使函數(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://segmentfault.com/q/101... 時(shí)引發(fā)的思考,雖然概念我明白,但是當(dāng)時(shí)一直想在函數(shù)內(nèi)部調(diào)用的repeat為什么訪問不到調(diào)用他的函數(shù)的局部變量,今天又翻了下參考資料自己用代碼測試了一遍。希望這篇文章能幫助到有同樣困惑的朋友。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85804.html
摘要:作用域和閉包是最重要的概念之一,想要進(jìn)一步學(xué)習(xí),就必須理解作用域和閉包的工作原理。全局和局部作用域的關(guān)系在函數(shù)體內(nèi),局部變量的優(yōu)先級高于同名的全局變量。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。 作用域和閉包是 JavaScript 最重要的概念之一,想要進(jìn)一步學(xué)習(xí) JavaScript,就必須理解 JavaScript 作用域和閉包的工作原理。 作用域 任何...
摘要:在一個(gè)閉包環(huán)境內(nèi)修改變量值,不會(huì)影響另一個(gè)閉包中的變量。直到看到函數(shù)閉包閉包這篇文章的代碼一部分,終于明白其中的邏輯了。 閉包 閉包定義:指擁有多個(gè)變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該表達(dá)式的一部分。函數(shù)內(nèi)部可以直接讀取全局變量。函數(shù)內(nèi)部變量無法在函數(shù)外部訪問。函數(shù)內(nèi)部聲明要用var或者let聲明,不然會(huì)變成全局變量鏈?zhǔn)阶饔糜颍鹤訉ο髸?huì)一級級向上尋找...
摘要:而外層的函數(shù)不能訪問內(nèi)層的變量或函數(shù),這樣的層層嵌套就形成了作用域鏈。閉包閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的最常見的方式就是在一個(gè)函數(shù)內(nèi)創(chuàng)建另一個(gè)函數(shù),通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量。 閉包是js中一個(gè)極為NB的武器,但也不折不扣的成了初學(xué)者的難點(diǎn)。因?yàn)閷W(xué)好閉包就要學(xué)好作用域,正確理解作用域鏈,然而想做到這一點(diǎn)就要深入的理解函數(shù),所以我們從函數(shù)說起。 函數(shù)...
摘要:函數(shù)使用它們實(shí)參的值來計(jì)算返回值,稱為該函數(shù)調(diào)用表達(dá)式的值。通常函數(shù)名的第一個(gè)字符為小寫。在函數(shù)內(nèi)部定義的變量,外部無法讀取,稱為局部變量。注意對于命令來說,局部變量只能在函數(shù)內(nèi)部聲明,在其他區(qū)塊中聲明,一律都是全局變量。 函數(shù) 1.函數(shù)簡介 通過函數(shù)可以封裝任意多條語句,而且可以在任何地方、任何時(shí)候調(diào)用。 ECMAScript中的函數(shù)使用function關(guān)鍵字來聲明,后跟一組參數(shù)以及...
閱讀 2794·2023-04-25 14:41
閱讀 2397·2021-11-23 09:51
閱讀 3687·2021-11-17 17:08
閱讀 1678·2021-10-18 13:31
閱讀 5560·2021-09-22 15:27
閱讀 920·2019-08-30 15:54
閱讀 2232·2019-08-30 13:16
閱讀 739·2019-08-29 17:04