函数的执行

函数执行

call();
apply();

call()

function fn(a,b,c){
console.log(this,a+b+c);
}
正常执行是:fn();//this window
call执行时:fn.call(obj);//将obj带入到函数替代函数中this的指向,原有的this会被指向obj
call带参数执行时:fn.call(obj,1,2,3);//第一个参数是函数中this指向的对象,后面会按顺序带入参数

如果call和apply带入不是对象,会自动转换为对象
fn.call(“5”); this会变为string 5

apply()

fn.apply(obj);//和call一样
fn.apply(obj,[1,2,3]);//apply只有两个参数,第一个参数是this指向的对象,第二个参数是函数所需的所有参数的数组,列表

求最小值 重构Math.min
var arr=[1,2,3,4,5];
var min=Math.min.apply(null,arr);
var Maths={
    min:function(){
        if(arguments.length===0) return;
        var min=arguments[0];
        if(arguments.length===1) return min;
        for(var i=1;i<arguments.length;i++){
            min=min>arguments[i] ? arguments[i] : min;
        }
        return min;
    }
}
Maths.min.apply(null,arr)
重构slice 复制
    class Arrays{
      constructor(){

      }
      slice(start,end){
        if(start===undefined) start=0;
        if(end===undefined) end=this.length;
        var arr=[];
        for(var i=start;i<end;i++){
            arr.push(this[i]);
        }
        return arr;
      }
  }
  var arr=new Arrays();
    arr.slice.call(document.getElementsByTagName("div")); //复制div列表

bind()

回调函数 回调函数如果需要替换this,不能使用call和apply.
比如setTimeout,如果使用了call或者apply,就会立即执行。达不到效果
这时要用bind(),执行回调或者事件函数。
通过bind可以对于回调函数传参,this就是bind绑定的内容

setTimeout:
    var obj={a:1};
    setTimeout((function(){
        console.log(this);
    }).bind(obj),10000);
事件函数:
var obj={
    a:1,
    b:function(){
        this.handler=this.clickHandler.bind(this);
        document.addEventListener("click",this.handler)
    },
    clickHandler:function(e){
        console.log(this);
        document.removeEventListener("click",this.handler)
    }
}
obj.b();
红绿灯
var id;
function setLight() {
    arguments[0](arguments[1], arguments[2]);
}

function showLight(fn,fn2){
    clearTimeout(id);
    console.log(this.toString());
    id = setTimeout(fn, 2000, fn2, arguments.callee.bind(this));
}
setLight(showLight.bind("红"),showLight.bind("黄"),showLight.bind("绿"));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值