1.全局變量和局部變量
1.在函數中的局部變量和全局變量重名,局部變量會覆蓋全局變量。
2.變量提升: Javascript在執行前會對
整個腳本文件的聲明部分做完整分析(包括局部變量),先獲取所有被聲明的變量再逐一執行,所有變量的聲明語句都會被提升到當前代碼塊的頭部,但是不能對變量定義做提前解析。 注:代碼塊指的是function的一個{},通常的if、while、for的{}中變量不會提升。


全局變量的優點:
1.可以減少變量的個數,減少由於實參和形參的數據傳遞帶來的時間消耗。
缺點:
1.全局變量保存在靜態存儲區,程序開始運行時為其分配內存,程序結束運行時釋放其內存。相比較而言生命周期長,且數量較多時,會占用較大的內存。
2.使用全局變量會破壞函數的封閉性和獨立性,導致函數的可移植性降低。
3.當一個全局變量多次被不同的語句(函數)操作,全局變量的值容易變得不清晰,這便降低了程序的可讀性,不利於在編碼后進行調試和查錯之類的操作。
局部變量的優點:
1.局部變量是程序動態分配內存的,所以生命周期短,不會造成長時間占用過多內存的情況。
2.局部變量定義在函數內部,限於函數內部調用,故能夠有效的保證函數的封閉性。
3.即使在多個函數內部定義了多個同名局部變量,它們之間也不會相互影響。
缺點:
1.局部變量中的數據在函數執行完后就會消失,故不利於數據的保留。
2.局部變量的使用范圍有限,僅限於所屬函數的內部。
2.閉包

其實就是一個層級關系,假設函數parent里面沒有返回函數child,那么,你就訪問不到函數child。這就形成了一個閉包。
注意一定要先訪問父函數,才能訪問到子函數,假設父函數沒有執行子函數,也一樣訪問不到子函數。
子函數繼承父函數變量, b2函數里的++i可以獲得i的值變為1000, 父函數不可以讀取子函數變量。
如果當window通過b1可以直接訪問到++i的值了,就說明是閉包了
閉包一般都是必須有return 返回值的
閉包的時候,因為是引用關系,b2執行時,必須要有b1的i變量,而當執行b1函數的時候,是引用關系,所以,這是2個函數中的變量是互相使用的,系統不會刪除變量。
所以,閉包的最好的理解就是:函數內部變量(局部變量)可以被外部讀取的函數,稱為閉包。
循環中的閉包
輸出數字 10 十次,當 console.log 被調用的時候,匿名函數保持對外部變量 i 的引用(函數內部的變量都是局部變量,函數執行后,就會被系統刪除),此時 for循環已經結束, i 的值被修改成了 10.
輸出0到9
外部的匿名函數會立即執行,並把 i 作為它的參數,此時函數內 e 變量就擁有了 i 的一個拷貝。當傳遞給 setTimeout 的匿名函數執行時,它就擁有了對 e 的引用,而這個值是不會被循環改變的。


使用閉包需要注意以下兩點:
1.由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
2.閉包會在父函數外部,改變父函數內部變量的值。