美文网首页
面向对象-继续

面向对象-继续

作者: 012ca771a446 | 来源:发表于2017-03-04 09:43 被阅读0次

    变量的作用域&搜索规则

    如果在内层作用域中声明了和外层作用域中同名的变量,那么这个变量是不会把外层的同名变量覆盖的.

    搜索规则:

    01 在作用域中如果访问(读取|设置)某个变量,先在当前作用域中搜索,如果找到那么就直接使用
    02 如果没有找到,那么就向上一级作用域中继续搜索,找到则使用,没有找到就重复上面的过程
    03 直到0级作用域链
    demo:

    <script>
       var num = 10;
       function f1(){
           console.log(num);       // 10
           num = 66;
           console.log(num);       //? 66
    
           function f2(){
               var num = 99;
               console.log(num);   //? 99
           }
    
          var num = 1000;
           f2();
           console.log(num);       //1000
       }
       f1();
       console.log(num);           //10
    </script>
    

    惰性函数

    函数的真正内容在调用了一次之后才确定,能够实现自我更新;

     function foo(){
            console.log("foo!");
    
            //主要处理初始化操作......
    
            //实现函数的自我更新
            foo = function (){
                console.log("foo! foo!");
            }
        }
        foo();  //foo!
        foo();  //foo!foo!
        foo();  //foo!foo!
    

    适合应用场景:
    需要先做一次性的初始化处理

    在使用惰性函数的时候 有几点需要注意:
    01 如果在函数上面添加了属性,那么进行自我更新之后这个属性会丢失;
    示例:

    function f1(){
           console.log("f1");
           f1 = function(){
               console.log("新的函数体");
           }
       }
    
       //函数是一个对象,因此可以添加属性
       f1.des = "描述信息";
       f1();       //f1
       f1();       //新的函数体
       console.log(f1.des);   //描述信息  ? undefined(正确)  在函数更新之后属性丢失
    02 如果把函数赋值给其他的变量,那么我们以变量的方式来调用,将会永远执行旧函数,不会实现自我更新!
    示例:
    
    function f1(){
        console.log("f1");
        f1 = function(){
            console.log("新的函数体");
        }
    }
    
    //把函数赋值给变量
    var func = f1;
    
    func();  //f1
    func();  //f1
    func();  //f1
    f1();
    
    var obj = {};
    obj.demoFunc = f1;
    obj.demoFunc(); //f1
    obj.demoFunc(); //f1
    
    03 如果把函数赋值给对象,成为对象的方法, 那么我们以对象的方法来调用,也是不会更新;
    

    即时对象初始化方法

    基本写法:({init:function (){}}).init();
    使用场景:
    和惰性函数定义很像,如果代码中需要做一些一次性的初始化操作,那么就可以用这种方法:

    ({
            name:"张三",
            age:20,
            showName:function(){
                console.log(this.name);
            },
            showAge:function(){
                console.log(this.age);
            },
            init:function(){
                //做一些需要一次性处理的初始化操作
                //在对象的方法中调用该对象的其他方法:需要使用this前缀
                this.showName();
                this.showAge();
            }
        }).init();
    

    相关文章

      网友评论

          本文标题:面向对象-继续

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