zoukankan      html  css  js  c++  java
  • js的事件处理与闭包:

    var i = 0;
    for(i=0;i<5;i++){
    (function(i){
    setTimeout(function(){alert(i)},3000);
    })(i)
    }
    // 上面打印出的i的顺序是随机的

    上面的这里的i指的是简单的数据类型,非引用类型。

    =============================

    var ss = 0;
    var sss = {
    age : 18,
    a : {
    age:28
    }
    }
    function box(id){
    var self = this;
    self.ss++;
    sss.age++;
    sss.a.age++;
    var ccc = $.extend({},sss);
    (function(self,sss){
    $(id).click(function(){
    alert(self.ss+"sss=>"+sss.age+"sss.a=>"+sss.a.age);
    });
    })(self,ccc)

    }
    box('#box1');
    box('#box2');

    这里的var ccc = $.extend({},sss);指的是浅拷贝。
    浅拷贝也是拷贝。
    只是他默认把所有的数据类型的第一层都默认为简单的数据类型。
    如果第一层中有引用类型,他也当简单的数据类型处理了。
    var ccc = ssss;
    这个不叫拷贝,也不叫浅拷贝,这个叫引用。

    #box1  //1 19 30

    #box2 //2 20 30

    //====================

    var ss = '';
    function yan(bb){
        ss = bb;
    (function(ss){
        setInterval(function(){
            console.log(ss);
        },2000);
    })(ss)
    }
    
    yan('a');
    yan('b');
    yan('c');
    //==============
    var ss1 = '';
    function yan(bb1){
        ss1 = bb1;
    
        setInterval(function(){
            (function(ss1){
            console.log(ss1);
            })(ss1)
        },2000);
    
    }
    
    yan('a1');
    yan('b1');
    yan('c1');
    

      

    对于闭包的理解,函数中的函数,为什么闭包可以把,局部变量变为全局变量,因为,闭包是一个函数,函数可以操作变量,这个变量首先考虑就近的局部变量,这个函数最后返回,还是通过赋给window变量,都一样。我们通过调用这个函数,直接操作了局部变量,所以说局部变量变为了全局的。

     

     

    js new的时候,会自动执行一次构造函数,并且,默认返回this(一般情况下this就是window,这句话有漏洞,或者说没有返回),如果,返回的不是this的话,如果是一个对象的话,那么也是一个新的对象。如果返回一个闭包的话,那么也是一个新的。

    function box(config){
            var self = this;
            this.width = config.width;
            this.height = config.height;
            var defaultConfig = {
                 "100",
                height:"100"
            }
            defaultConfig = $.extend(true, defaultConfig, config);
            var detail = {
                add:function(){
                    defaultConfig.width++;
                },
                log:function(){
                    alert(defaultConfig.width+"  "+defaultConfig.height);
                },
                domain:function(){
                    alert(self.width+"  "+self.height);
                }
            }
            return detail;
        }
    

    如果不用New的话,

    var a = box(config);
        a.log();//200 300
        a.domain();//200 300
        var config = {
            2000,
            height:3000
        }
        var b = box(config);
        b.log();//2000 3000 
        b.domain();//2000 3000
        a.add();//200 300
        a.domain();//2000 3000
    

    如果用New的话

    var config = {
            200,
            height:300
        }
        var a = new box(config);
        a.log();//200 300
        a.domain();//200 300
        var config = {
            2000,
            height:3000
        }
        var b = new box(config);
        b.log();//2000 3000 
        b.domain();//2000 3000
        a.log();//200 300
        a.domain();//200 300  这里是主要的差别
    

      还有一点需要注意的。

         随便写一个函数,函数中的this,指向window.

       因为总体就是一个window对象,

    所以一个变量就是window.变量

    所以一个函数就是window.函数

    函数里边this,也是window. 但是var就不是了。

  • 相关阅读:
    Android获取View对应的Bitmap
    Android按需添加Google Play服务
    Android自定义View的构造函数
    两个Fragment之间如何传递数据
    SmartImageView
    onSingleTapUp()和onSingleTapConfirmed()的区别
    Android Fragment add/replace以及backstack
    InputStream与InputStreamReader的区别
    Android手动签名
    使用后台服务数据更新UI
  • 原文地址:https://www.cnblogs.com/coding4/p/5707560.html
Copyright © 2011-2022 走看看