javascript嵌套函數和在函數內調用外部函數的區別分析_javascript技巧

來源:互聯網
上載者:User

我們都知道在函數中定義的局部變數在聲明他的函數體以及其嵌套的函數內始終是有定義的,並且在函數的範圍鏈上始終會有個對象指向全域對象,使函數能夠訪問到全域變數。

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://www.jb51.net/article/78958.htm時引發的思考,雖然概念我明白,但是當時一直想在函數內部調用的repeat為什麼訪問不到調用他的函數的局部變數,今天又翻了下參考資料自己用代碼測試了一遍。希望這篇文章能協助到有同樣困惑的朋友。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.