封閉函數(shù) 閉包

(1)封閉函數(shù)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>封閉函數(shù)</title>
  <script type="text/javascript">
      /*原來的寫法
      function myAlert(){
          var str = '歡迎訪問我的主頁';
          alert(str);
      }
      myAlert();*/
      var str = function(){
          alert('test');
      }
      
      //封閉函數(shù)的一般寫法
      //封閉函數(shù)定義:(function(){……})()
      /*
      ;;(function(){
          var str = '歡迎訪問我的主頁';
          alert(str);
      })();//最后的()表示馬上執(zhí)行
      */
      //封閉函數(shù)其他的寫法:在匿名函數(shù)前加“!”或者“~”,之后加“()”
      ~function(){
          var str = '歡迎訪問我的主頁';
          alert(str);
      }();
  </script>
</head>
<body>
  
</body>
</html>

(2)用變量的方式定義函數(shù)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用變量的方式定義函數(shù)</title>
    <script type="text/javascript">
        /*
        原來的寫法:可以提前
        myAlert();
        function myAlert(){
            alert('hello!');
        }*/
        //函數(shù)用變量方式定義:先定義再使用
        // myalert();//提前會報(bào)錯(cuò)
        var myAlert = function(){
            alert('hello!');
        }
        myAlert();//放在下面可以執(zhí)行
    </script>
</head>
<body>
    
</body>
</html>

(3)閉包

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>閉包</title>
    <script type="text/javascript">
        /*
        //閉包的一般寫法
        function aa(b){
            var a = 12;
            function bb(){
                alert(a);
                alert(b);
            }
            return bb;
        }
        var cc = aa(24);*/
        
        //閉包的封閉函數(shù)寫法
        var cc = (function(b){
            var a = 12;
            function bb(){
                alert(a);
                alert(b);
            }
            return bb;
        })(24);
        cc();
        
        /*
        //只能調(diào)用一次的閉包
        (function(b){
            var a = 12;
            function bb(){
                alert(a);
                alert(b);
            }
            return bb;
        })(24)();
        */
    </script>
</head>
<body>
    
</body>
</html>

(4)閉包存循環(huán)的索引

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>閉包存循環(huán)的索引值</title>
    <style type="text/css">
        li{
            height: 30px;
            background-color: gold;
            margin-bottom: 10px;
        }
    </style>
    <script type="text/javascript">
        //閉包的用途:存循環(huán)的索引值
        window.onload = function(){
            var aLi = document.getElementsByTagName('li');
            // alert(aLi.length);//8
            for(var i=0; i<aLi.length; i++){
                /*
                aLi[i].onclick = function(){
                    alert(i);//每個(gè)li都彈出8,因?yàn)辄c(diǎn)擊時(shí)循環(huán)已完畢,i最后為8
                }
                */
                (function(k){//這里的k是形參
                    aLi[k].onclick = function(){
                        alert(k);//彈出每個(gè)li的索引值
                    }
                })(i);//這里的i是實(shí)參
            }
        }
    </script>
</head>
<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
    </ul>
</body>
</html>

(5)閉包做私有變量計(jì)數(shù)器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>閉包做私有變量計(jì)數(shù)器</title>
    <script type="text/javascript">
        //閉包的用途:私有變量計(jì)數(shù)器
        var count = (function(){
            var a = 0;
            function bb(){
                a++;
                return a;
            }
            return bb;
        })();
        
        //每調(diào)用一次count,a就自增一次
        alert(count());//1
        alert(count());//2
        var c = count();
        alert(c);//3
    </script>
</head>
<body>
    
</body>
</html>

(6)閉包做選項(xiàng)卡

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>閉包做選項(xiàng)卡</title>
    <style type="text/css">
        .btns{
            width: 500px;
            height: 50px;
        }
        /*選項(xiàng)卡的樣式*/
        .btns input{
            width: 100px;
            height: 50px;
            background-color: #ddd;/*默認(rèn)灰色*/
            color: #666;
            border: 0px;
        }
        /*被選中的選項(xiàng)卡的樣式*/
        .btns input.cur{
            background-color: gold;
        }
        /*內(nèi)容區(qū)的樣式*/
        .contents div{
            width: 500px;
            height: 300px;
            background-color: gold;
            display: none;/*默認(rèn)隱藏*/
            line-height: 300px;
            text-align: center;
        }
        /*被選中的內(nèi)容區(qū)的樣式*/
        .contents div.active{
            display: block;
        }
    </style>
    <script type="text/javascript">
        //閉包做選項(xiàng)卡
        window.onload = function(){
            var aBtn = document.getElementById('btns').getElementsByTagName('input');
            var aCon = document.getElementById('contents').getElementsByTagName('div');
            // alert(aCon.length);
            //循環(huán)所有的選項(xiàng)卡按鈕
            for(var i=0; i<aBtn.length; i++){
                (function(i){
                    //給每個(gè)選項(xiàng)卡按鈕添加點(diǎn)擊事件
                    aBtn[i].onclick = function(){
                        //遍歷所有選項(xiàng)卡按鈕
                        for(var j=0; j<aBtn.length; j++){
                            //將每個(gè)選項(xiàng)卡按鈕都設(shè)為灰色
                            aBtn[j].className = '';
                            //將每個(gè)內(nèi)容區(qū)都隱藏
                            aCon[j].className = '';
                        }
                        //this代表當(dāng)前點(diǎn)擊的Button對象
                        this.className = 'cur';//當(dāng)前點(diǎn)擊的按鈕為金色
                        // alert(i);//不加閉包時(shí),不管點(diǎn)哪個(gè)按鈕,i都等于3
                        //加閉包保存了索引值才有效
                        aCon[i].className = 'active';//當(dāng)前點(diǎn)擊的按鈕對應(yīng)的內(nèi)容顯示
                    }
                })(i);
            }
        }
    </script>
</head>
<body>
    <div class="btns" id="btns">
        <input type="button" value="tab01" class="cur">
        <input type="button" value="tab02">
        <input type="button" value="tab03">
    </div>
    <div class="contents" id="contents">
        <div class="active">tab文字內(nèi)容一</div>
        <div>tab文字內(nèi)容二</div>
        <div>tab文字內(nèi)容三</div>
    </div>
</body>
</html>

(8)跳轉(zhuǎn)的源頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>跳轉(zhuǎn)的源頁面</title>
    <script type="text/javascript">
        
    </script>
</head>
<body>
    
</body>
</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容