精通Javascript 之 範圍和閉包

來源:互聯網
上載者:User

JS裡範圍是由函數劃分的,而不是由塊(while、if和for)劃分。函數可以直接讀取全域變數,但是外部無法直接存取函數內部的變數。
閉包的意思是內層的函數可以引用存在於包圍它的函數內的變數,即使外層函數的執行已經終止。閉包之於JS是非常重要的概念。
假設說有這麼一個例子:

function f1(){     n=999;//聲明了一個全域變數   }   f1();   alert(n); // 999,外部使用到這個變數 

假設我們真的需要完成這樣一個功能,n這個全域變數的聲明是不合適的,這是一個壞習慣,誰也不知道你在函數內部還聲明了一個名為n的全域變數。所以我們需要把n藏起來

function f1(){     var n=999;     function f2(){       alert(n);     }     return f2;  }   var result=f1();   result(); //這個就是執行函數f2 

這個方法通過建立一個f2這個函數把n變數讀取到外部,並執行和第一段代碼相同的功能。這個就是閉包最基礎的用法,外部調用函數內部的變數。閉包還能使這個變數值始終保持在記憶體裡,看下面這個應用:

function f1(){     var n=999;     nAdd=function(){n+=1}     function f2(){       alert(n);     }     return f2;   }   var result=f1();   result(); // 999   nAdd();   result(); // 1000

為什麼n的值始終保持在記憶體裡呢?f1函數的執行結果f2在外部被賦予給一個全域變數,所以f2裡面的內容不會被回收,n變數值一直被儲存著。而nAdd呢是被定義的一個全域變數而且是個匿名函數,也相當於一個閉包可以對n進行操作。所以第二個result的執行結果是1000.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.