js閉包


啥是閉包?

閉包是能讀取其他函數內部變量的函數,js中能讀取一個函數內部變量的只有該函數的后代函數,在函數的外部是訪問不了函數的變量的.

需要操作某個函數的內部變量時,不能把所有的操作都放在函數內部,這樣就需要內部函數作為一個橋梁,將函數的信息輸送出來

 

注意一點,在函數內部聲明變量時必須要使用var,否則系統會認為你聲明的是一個全局變量

聲明變量時,如果不寫var,系統會認為聲明的是window.a,即window對象的屬性

閉包有啥用?

1.可以防止全局的命名空間被污染

  --如果要寫一個累加器,不使用閉包的話,就必須定義一個全局的變量來接收

        var count = 0;
        function add(){
            count++;
            console.log(count);
        }
     //每次調用add函數count就會加1 add(); add(); add();
     //這個函數如果count變量放在函數內部,每次調用函數時count都會被重置為0,不能達到累加的作用
     //如果使用閉包就不會出現這一問題

 

2.便於模塊化開發

使用閉包開發的項目各個功能都被封裝到了各自的函數中,之間互不影響

3.安全性

將變量都變為私有的,只有通過內部函數才能訪問函數的變量,能夠提高成程序的安全性

閉包咋寫啊?

上面的例子如果寫成閉包的形式就是這樣:

        function add(){
            var count = 0;
            function inner(){
                count++;
                console.log(count);
            }
            return inner;
       //將內部函數作為返回值返回 }
var outer = add();//定義一個變量接收add函數的返回值 outer(); outer(); outer();
     //在函數外add函數外直接訪問count變量是不可能的,但是通過閉包就可以實現

閉包經常與for循環和匿名自調用函數結合:

<!DOCTYPE html>
<html>
<head>
    <title>模擬一個非誠勿擾的場景</title>
    <script type="text/javascript">
        window.onload = function(){
            var btn = document.querySelectorAll('.choiceArea>button');
            function demo(){
                for(var i=0;i<btn.length;i++){
                    //每次循環都將i作為一個參數賦值給j
                    (function(j){
                        btn[j].onclick =function(){
                            alert("你的的選擇是"+(j+1)+"號女嘉賓");
                        }
                    }(i));
                };
            }
            demo();
        }
    </script>
</head>
<body>
    請選擇你的心動女生:<br />
    <form class="choiceArea">
        <button>1號女嘉賓</button>
        <button>2號女嘉賓</button>
        <button>3號女嘉賓</button>
        <button>4號女嘉賓</button>
        <button>5號女嘉賓</button>
    </form>
</body>
</html>

閉包的缺點

正常函數執行結束之后會立即銷毀,而閉包因為存在引用會一直存在在內存中,如果閉包過多就會在內存中占用大量資源,影響程序的性能.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM