var 聲明變量的變量提升問題(let/const)


在ES6之前,JavaScript沒有塊級作用域(一對花括號{}即為一個塊級作用域),只有全局作用域和函數作用域。變量提升即將變量聲明提升到它所在作用域的最開始的部分。既全局變量.

<script>
    let a=[];        #console.log(i)//undifined
    for(var i=0;i<5;i++){
        a[i]=function () {
            console.log(i)
        }
    }
    a[2]();//5  此時i是全局變量,會先聲明變量i,然后for循環賦值

    let f=[];
    for(let i=0;i<5;i++){
        f[i]=function () {
            console.log(i)
        }
    }
    f[2]();//2
    //let 和 const 聲明變量1.都不存在變量提升,2.局部作用域,3.變量不能重復聲明
    // console.log(b);  #報錯
    {
        const b=5;
        // b++;
        //const 同let,並且只能聲明常量(不可變的量),且不能做修改,
    }


</script>

 

需求:鼠標放到上面的li上,li本身變色,對應的p也顯示出來

思路:1.點亮上面的盒子。 2.利用索引值顯示下面的盒子。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            ul{
                list-style: none;
            }
            #tab{
                width: 480px;
                margin: 20px auto;
                border: 1px solid red;
            }
            ul{
                width: 100%;
                overflow: hidden;
            }
            ul li{
                float: left;
                width: 160px;
                height: 60px;
                line-height: 60px;
                text-align: center;
                background-color: #cccccc;
            }
            
            ul li a{
                text-decoration: none;
                color:black;
            }
            li.active{
                background-color: red;
            }
            p{
                display: none;
                height: 200px;
                text-align: center;
                line-height: 200px;
                background-color: red;
            }
            p.active{
                display: block;
                
            }
            
        </style>
    </head>
    <body>
        <div id="tab">
            <ul>
                <li class="active">
                    <a href="#">首頁</a>
                </li>
                <li>
                    <a href="#">新聞</a>
                </li>
                <li>
                    <a href="#">圖片</a>
                </li>        
            </ul>
            <p class="active">首頁內容</p>
            <p>新聞內容</p>
            <p>圖片內容</p>
        </div>
    </body>
    
    <script>
        var obtns=document.getElementsByTagName('li');
        var op=document.getElementsByTagName('p');
        for(var i=0; i<obtns.length;i++){     //因為i是全局變量,導致最后(遍歷綁定所有事件后)i的值是3.
            
       obtns[i].index
=i;            //綁定索引值(新增一個自定義變量:index屬性) obtns[i].onclick=function(){ for(var j=0;j<obtns.length;j++){ //走到這證明已經觸發了事件,i此時的值已經是3了 obtns[j].className=''; op[j].className=''; } this.className='active';      //所以可以用this(事件源自身,和self一樣)  
                              //op[i].className='active'; 會報錯.因為此時i的值也是3,所以可以通過綁定索引來來獲取對應的索引值,this.index op[
this.index].className='active';  //此時才不會報錯                                       } } </script> </html>

 

方式2

  可用es6的let替換掉var ,則聲明的變量不會存在變量提升,屬於局部作用域.上面的綁定索引步驟就可以省略了.


免責聲明!

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



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