Javascript之闭包

**闭包**
<script type="text/javascript">
    /* 闭包:
         1.函数里面的函数
         2.在外函数内部能调用外函数局部变量的函数
       作用域:
         全局作用域:页面
         局部作用域:方法中


        全局变量:1.在函数外部定义    2.不用var修饰的变量
        局部变量
    */
    var a = 20;//全局变量
    function fun(){
        var c = 100;//局部变量
        b = 30;//全局变量
        b++;
        alert(a++);
    }
    fun();
//  alert(a);
//  alert(b);
//  alert(c);//弹不出来,undefined,被销毁了

    //闭包
    var num = 100;
     function func(){
         var num2 = 100;

         //对外提供的公共方法(setter方法)
         method = function(){
             num+=1;
         }
         //闭包:确保局部变量在函数执行完毕还存在于内存中
    //public方法
        var method2 = function(){//闭包
            // alert(num2);
            alert("hello");
         }
         return method2;
     }
//   func()();//调用内部函数
    var result = func();
    method();
    result();

</script>

**递归**

<script type="text/javascript">
    //递归:函数自身调用自身   入口  出口

    //累加
    function fun(n){
        if(n==0){
            return 0;
        }
        return n+fun(n-1);
    }
    alert("所求之和为:"+fun(100));
    //斐波数列
    function func(n){
        if(n==1|n==2){
            return 1;
        }else{
            return func(n-2)+func(n-1);
        }

    }
    alert("所求之数为:"+func(6));
</script>

**修改指针指向**

<script type="text/javascript">
/* 指针:函数调用者对象

*/
    function fun(){
        alert(this);
    }
    fun();//this代表调用该函数的对象---window
    //修改指针:改变调用函数对象
    //需求:将fun1的调用指针改变为fun2
    function fun1(){
        alert(a+b);
        alert(this);
    }
    function fun2(){
        alert(a+b);
    }
    fun1.call(fun2,20,30);//输出来是fun2的对象==说明指针指向fun2
    fun1.apply(fun2,[20,30]);

    //简单模拟继承
    function Person(name,sex){
        this.name = name;
        this.sex = sex;

        this.speak = function(){
            alert(this.name);
        }
    }
    function Chinese(name,sex,age){
        this.name = name;
        this.sex = sex;                                                                   
        this.age = age;
    }
    var person = new Person("张三","男");
    var ch = new Chinese("李四","女  ");
    person.speak.call(ch,"张三","男");

    ch.speak;
</script>

**arguments**

<script type="text/javascript">
    function fun(a,b,c){
        for(var i = 0;i<arguments.length;i++){
            alert(arguments[i]);
        }
        alert(arguments.callee);//返回当前执行的函数对象
        func();
    }
    fun(1,2,3);

    function func(){
        alert(func.caller);//返回调用函数的函数对象
    }
//  func();
</script>

**prototype**

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

        this.eat = function(){
            alert(this.name + "is eatting...");
        }
        this.bite = function(){
            alert(this.name+"---"+this.age);
        }
    /* 1.可以给函数添加额外的方法或属性
       2.可以类似于重写函数的方法 
    */
    //在函数内定义方法时有重名的,使用原型定义时,仍然以非原型为主
        Animal.prototype.bite = function(){
            alert(this.name+"can bite...");
        }
    }
    //在函数外添加方法
    Animal.prototype.out = function(){
        alert(this.name+"---is gettng out");
    }
    Animal.prototype.sex = "雄性";
    var animal = new Animal("阿黄",20);
    animal.eat();
    animal.bite();
    animal.out();
    alert(animal.sex);
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值