闭包

作者: 小袋鼠cf | 来源:发表于2018-09-20 22:52 被阅读0次

    一、创建对象
    1、单体创建对象

    <script type="text/javascript">
    var Tom = {
    // 属性
    name:'tom',
    age:18,
    
        // 方法
        showName:function(){
            alert(this.name);
        },
        showAge:function(){
            alert(this.age);
        }
    }
    
    //调用属性
    alert(Tom.name);
    alert(Tom.age);
    
    //调用方法
    Tom.showName();
    

    </script>

    2、工厂模式创建对象

    <script type="text/javascript">
    function Person(name,age,job){
    //创建一个空对象
    // var o = new Object();//方式一
    var o = {};//方式二

        o.name = name;
        o.age = age;
        o.job = job;
    
        o.showName = function(){
            alert(this.name);
        }
        o.showAge = function(){
            alert(this.age);
        }
        o.showJob = function(){
            alert(this.job);
        }
    
        return o;
    }
    
    var Tom = Person('tom',18,'程序猿');
    Tom.showJob();
    
    var Jack = Person('jack',19,'攻城狮');
    Jack.showJob();
    

    </script>
    3、原型模式

    <script type="text/javascript">
    function Person(name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;

            Person.prototype.showName = function(){
                alert(this.name);
            }
            Person.prototype.showAge = function(){
                alert(this.age);
            }
            Person.prototype.showJob = function(){
                alert(this.job);
            }
        }
    
        //先去自己的对象中找showName函数,再去构造函数的原型找
        var Lucy = new Person('lucy',18,'测试鼠');
        //重写自身对象中的方法,不会影响其它对象
        Lucy.showName = function(){
            alert('我的名字是' + this.name);
        }
        Lucy.showName();//我的名字是lucy
    
        var Lily = new Person('lily',19,'市场鸡');
        Lily.showName();//lily
    
        alert(Lucy.showName == Lily.showName);//false
    </script>
    
    

    二、call和apply的区别
    二者都可以改变当前的this,区别在于apply方法要将参数放入数组中再传参

    三、函数的继承

    <script type="text/javascript">
        //父类
        function Fclass(name, age){
            this.name = name;
            this.age = age;
        }
        Fclass.prototype.showName = function(){
            alert(this.name);
        }
        Fclass.prototype.showAge = function(){
            alert(this.age);
        }
    
        //子类
        function Sclass(name, age, job){
            //属性用call或者apply的方式来继承
            Fclass.call(this, name, age);
            this.job = job;
        }
        //方法继承:将父类的一个实例赋值给子类的原型属性
        Sclass.prototype = new Fclass();
        Sclass.prototype.showJob = function(){
            alert(this.job);
        }
    
        //由于已经继承了父类的属性和方法,所以可以直接调用
        var Driver = new Sclass('tom',18,'老司机');
        Driver.showName();
        Driver.showAge();
        Driver.showJob();
    </script>
    
    

    四、新增选择器

    <script type="text/javascript">
        window.onload = function(){
            var oDiv = document.querySelector('#div1');
            alert(oDiv);//弹出[object HTMLDivElement],表示选择了该Div
    
            //如果要选择多个元素用querySelectorAll
            var aLi = document.querySelectorAll('.list li');
            alert(aLi.length);//8
        }
    </script>
    </head>
    <body>
    <div id="div1">这是一个div元素</div>
    <ul class="list">
        <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>
    
    

    五、jQuery
    1、jQuery加载

    JS写法
    window.onload = function(){
    var oDiv = document.getElementById('div');
    alert(oDiv.innerHTML);//这是一个div元素
    }
    Query的完整写法
    比上面JS写法先弹出,因为window.onload是把页面元素加载、渲染完才弹出,而ready()是把所有页面的节点加载完之后就弹出了,不用等渲染了

    $(document).ready(function(){
            var $div = $('#div');
            alert('jQuery:' + $div.html());//jQuery:这是一个div元素
        })
    
    

    简写方式

        $(function(){
            var $div = $('#div');//CSS样式怎么写,这里就怎么写
            //html()方法相当于原生JS的innerHTML
            alert($div.html() + 'jQuery');
        })
    
    

    六、闭包
    1、闭包的用途:存循环的索引值
    函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制收回

    <style type="text/css">
    li{
    height: 30px;
    background-color: gold;
    margin-bottom: 10px;
    }
    </style>
    <script type="text/javascript">
    //闭包的用途:存循环的索引值
    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);//每个li都弹出8,因为点击时循环已完毕,i最后为8
            }
            */
    
            (function(k){//这里的k是形参
                aLi[k].onclick = function(){
                    alert(k);//弹出每个li的索引值
                }
            })(i);//这里的i是实参
        }
    }
    

    </script>

    2、闭包做私有变量计数器
    每调用一次count,a就自增一次

    alert(count());//1
    alert(count());//2
    var c = count();
    alert(c);//3

    3、闭包做选项卡

    <script type="text/javascript">
    //闭包做选项卡
    window.onload = function(){
    var aBtn = document.getElementById('btns').getElementsByTagName('input');
    var aCon = document.getElementById('contents').getElementsByTagName('div');
    // alert(aCon.length);

        //循环所有的选项卡按钮
        for(var i=0; i<aBtn.length; i++){
            (function(i){
                //给每个选项卡按钮添加点击事件
                aBtn[i].onclick = function(){
                    //遍历所有选项卡按钮
                    for(var j=0; j<aBtn.length; j++){
                        //将每个选项卡按钮都设为灰色
                        aBtn[j].className = '';
                        //将每个内容区都隐藏
                        aCon[j].className = '';
                    }
                    //this代表当前点击的Button对象
                    this.className = 'cur';//当前点击的按钮为金色
    
                    // alert(i);//不加闭包时,不管点哪个按钮,i都等于3
    
                    //加闭包保存了索引值才有效
                    aCon[i].className = 'active';//当前点击的按钮对应的内容显示
                }
            })(i);
        }
    }
    

    </script>

    获取地址栏参数

    window.onload = function(){
    //url?aa=tom#12
    var data = window.location.search;//?aa=tom
    var hash = window.location.hash;//#12
    alert(hash);//#12

        var oSpan = document.getElementById('span01');
        // alert(data);//?aa=tom
    
        var arr = data.split('=');
        // alert(arr);//?aa,tom
    
        var name = arr[1];
        oSpan.innerHTML = name;
    }
    

    math弹出随机数以及取整

    <script type="text/javascript">
    // var num = Math.random();
    // alert(num);//弹出0-1之间的随机数

    var a = 10;
    var b = 20;
    // var num = Math.random()*(b-a)+a;
    // alert(num);//弹出10-20之间的随机数
    
    var arr = [];
    for(var i=0; i<20; i++){
        // var num = Math.floor(Math.random()*(b-a)+a);//向下取整,10-19
        var num = Math.floor(Math.random()*(b-a + 1)+a);//向下取整,10-20
        
        arr.push(num);//生成一个数就放进数组
    }alert(arr);//17,20,20,11,11,19,17,16,10,11,16,11,18,13,13,11,17,14,19,19
    

    </script>

    相关文章

      网友评论

          本文标题:闭包

          本文链接:https://www.haomeiwen.com/subject/ffsonftx.html