js的變量和閉包的理解

最近項目裏涉及到關於js方面的知識,花了點時間研究下,遂記錄下來:
先來點開胃小知識:
1>全局變量和局部變量
全局變量:非局部變量就是全局變量,且在引入的多個js文件中通用。
局部變量:定義在方法內部的變量,函數的形參也屬於。

在方法內部定義變量,一定要加var,否則會被定義爲全局變量,例子如下:

var B = A(2);
B(10);
function A(x) {
     temp = 3;
     return function (y) {
         alert(x+y+(++temp));
     }

 }
 alert(temp);   //這裏會輸出4,因爲temp是全局變量。

//注意:如果將代碼裏的頭兩行去掉,那麼alert會報錯,顯示undefined,不是說temp是全局變量嗎,怎麼未定義?
//這是因爲 函數內部定義的變量,要在函數執行後纔會真正定義
//這段代碼內部執行情況是:執行A,發現一個沒有用 var 定義的 temp 於是去全局變量中尋找是否有這個變量,結果沒有,那麼我就創建一個temp全局變量。 

2> js中什麼可以作爲if的條件?
1.布爾變量 true/false;
2.數字非0 (負數也是可以的) 爲true
數字是0或者NaN 爲false
3.字符串爲非空串 爲true

重點來了

3>關於閉包的研究和理解。

 $(function () {
            function a() {
                var i = 999;      
            return  function () {              
                      return i++;                                                
                }
            }
            var c = a(); //c指向了匿名函數function(){return i++} ,因此內部函數被a外一個變量應用。使得a一直存在。
            var x = c(); //x指向i。
            alert(x);          
            x = c();
            alert(x);
            /*
閉包的本質,就是可以讀取其他函數內部變量的函數。
閉包的第一種形式:
當一個函數返回的是他內部的函數的時候  那麼就是一個閉包。

當函數a的內部函數b 被函數a外的一個變量c引用的時候,就創建了一個閉包c
閉包的作用:使得a執行完畢後,GC不會回收a所佔用的資源。
閉包的應用場景:1.在內存中維持一個變量,由於閉包c的存在,a中變量i可以一直維持。每次執行完c i會自動加1;
             2.通過保護變量安全時限js私有屬性和私有方法。   */

上述代碼中c就是一個閉包,或者說 return (){return i++} 就是一個閉包,正是由於這個閉包的存在,使得a在執行完之後,並不會被GC回收,而是保存在內存中,如它的變量 i 一值存在,所以運行一次c() i 就加 1 。

閉包的第二種形式。

閉包:函數可以調用函數之外的變量。
var a="a"
var n;
var bFn=function(){
    alert("a");
    alert("b");
    n=function(){
        var c="c";
        alert(c);
    }
}
n();  //n函數屬於全局域,但可以調用bFn中的b,因爲n指向它的內部函數。

其他關於很複雜的閉包例子什麼的,還等着繼續理解。

這是參考的一個博客:
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章