面向对象-继续

2017-03-04  本文已影响0人  012ca771a446

变量的作用域&搜索规则

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

搜索规则:

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();
上一篇下一篇

猜你喜欢

热点阅读