摘要:昨天在回答一個問題時引發的思考,雖然概念我明白,但是當時一直想在函數內部調用的為什么訪問不到調用他的函數的局部變量,今天又翻了下參考資料自己用代碼測試了一遍。
我們都知道在函數中定義的局部變量在聲明他的函數體以及其嵌套的函數內始終是有定義的,并且在函數的作用域鏈上始終會有個對象指向全局對象,使函數能夠訪問到全局變量。
var ga = "global"; var func = function() { var la = "local"; return function() { return function() { return function() { alert(la);alert(ga); } } } } a = func(); a()()();// 彈出 local 和 global
那么在外部定義的函數A, 被函數B在函數體內調用時,A能訪問到B中定義的局部變量嗎?答案是否定的,把上面的例子稍作修改如下
var ga = "global"; function repeat() { alert(la); } var func = function() { var la = "local"; alert(1); repeat(); alert(2); }; func();
上面的運行結果是只彈出了1,在調用repeat的時候,因為訪問了未定義變量js解釋器就報錯把程序中斷了。
原因是函數在定義時保存了一個作用域鏈,repeat函數在外部定義,在他的作用域中并沒有一個局部變量叫la,繼續在全局作用域查找也沒找到la所以就會報錯。
所以嵌套函數和在函數內嵌套調用外部函數還是有很大區別的。
昨天在回答一個問題http://segmentfault.com/q/101... 時引發的思考,雖然概念我明白,但是當時一直想在函數內部調用的repeat為什么訪問不到調用他的函數的局部變量,今天又翻了下參考資料自己用代碼測試了一遍。希望這篇文章能幫助到有同樣困惑的朋友。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85804.html
摘要:作用域和閉包是最重要的概念之一,想要進一步學習,就必須理解作用域和閉包的工作原理。全局和局部作用域的關系在函數體內,局部變量的優先級高于同名的全局變量。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。 作用域和閉包是 JavaScript 最重要的概念之一,想要進一步學習 JavaScript,就必須理解 JavaScript 作用域和閉包的工作原理。 作用域 任何...
摘要:在一個閉包環境內修改變量值,不會影響另一個閉包中的變量。直到看到函數閉包閉包這篇文章的代碼一部分,終于明白其中的邏輯了。 閉包 閉包定義:指擁有多個變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。函數內部可以直接讀取全局變量。函數內部變量無法在函數外部訪問。函數內部聲明要用var或者let聲明,不然會變成全局變量鏈式作用域:子對象會一級級向上尋找...
摘要:而外層的函數不能訪問內層的變量或函數,這樣的層層嵌套就形成了作用域鏈。閉包閉包是指有權訪問另一個函數作用域中的變量的函數,創建閉包的最常見的方式就是在一個函數內創建另一個函數,通過另一個函數訪問這個函數的局部變量。 閉包是js中一個極為NB的武器,但也不折不扣的成了初學者的難點。因為學好閉包就要學好作用域,正確理解作用域鏈,然而想做到這一點就要深入的理解函數,所以我們從函數說起。 函數...
摘要:函數使用它們實參的值來計算返回值,稱為該函數調用表達式的值。通常函數名的第一個字符為小寫。在函數內部定義的變量,外部無法讀取,稱為局部變量。注意對于命令來說,局部變量只能在函數內部聲明,在其他區塊中聲明,一律都是全局變量。 函數 1.函數簡介 通過函數可以封裝任意多條語句,而且可以在任何地方、任何時候調用。 ECMAScript中的函數使用function關鍵字來聲明,后跟一組參數以及...
閱讀 2781·2023-04-25 14:41
閱讀 2375·2021-11-23 09:51
閱讀 3674·2021-11-17 17:08
閱讀 1667·2021-10-18 13:31
閱讀 5528·2021-09-22 15:27
閱讀 910·2019-08-30 15:54
閱讀 2222·2019-08-30 13:16
閱讀 728·2019-08-29 17:04