call apply bind 的区别及用法

<!DOCTYPE html>
<html>
<head>
<title>call apply bind 比较</title>
</head>
<body>
<div class="d1">点击</div>
<!-- 1.call apply bind 都是用来改变this的指向
2.三者中的第一个参数都是指向想要指定的上下文环境
3.三者都可以通过后续的参数传参
4.bind返回的是对应的函数便于稍后调用,call和apply都是立即调用函数
-->
<script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js">
    </script>
<script type="text/javascript">
// call 和 this的区别
var animals=function(){};
animals.prototype = {
name: 'hash',
say:function(){
console.log('my name is'+' ' +this.name)
}
}
var anim = new animals;
anim.say();//my name is hash
dog = {
name:'wangwang'
}
//此时dog对象里面没有say方法 可以通过call和apply调用anim的say方法
anim.say.call(dog);//my name is wangwang
anim.say.apply(dog);//my name is wangwang
        //call 和 apply的作用方法一致 不同的地方在于第二个参数 
        var fn1 = function(ar1,ar2){
        console.log(ar1,ar2);
        }
        fn1.call(this,1,2)//1,2
        fn1.apply(this,[2,3,4])//2,3
        //当传入的参数不确定时 对方法的改写
        var log=function(){
        console.log.apply(console,arguments);
        }
        log("log","log")//log log
        //在log函数前面加上console
        /*改造方法 arguments是伪数组可以通过数组原型的slice方法转换为标准数组,在用unshift方法在数组前面加上console*/
        var consoles=function(){
        var ars=Array.prototype.slice.call(arguments);
        ars.unshift("console");
        console.log.apply(console,ars)
        }
        consoles(".log")
        //当参数数量不确定的时候,可以用apply,然后把参数push进数组传递进去。函数内部也可以通过arguments这个数组遍历所有的参数
        //1.数组之间的追加
        var arr1=[1,2,3];
        var arr2=[4,5,6];
        Array.prototype.push.apply(arr1,arr2);
        console.log(arr1)
        //2.获取数组中的最大值最小值 number本身没有max方法,但是Math有,我们可以借助call和apply使用其方法
        var numbers=[90,78,890,231]
        var maxNumber=Math.max.apply(Math,numbers);
        minNumber=Math.min.call(Math,90,78,890,231)
        console.log(maxNumber,minNumber)
        //bind bind()方法与apply和call很相似也可以改变函数体内this的指向;
        /*通常我们会使用_this,that,seft保存this,这样我们可以在改变了上下文之后继续引用到他*/
        var fn2=function(){};
        fn2.prototype={
        num:1,
        events:function(){
        var _this=this;
        $('.d1').on('click',function(e){
        console.log(_this.num)
        })
        }
        }
        var fn3=new fn2;
        fn3.events();
        //使用bind()可以更加优雅的解决这个问题
        var foo=function(){}
        foo.prototype={
        name:'fff',
        events:function(){
        $('.d1').on('click',function(){
        console.log(this.name)
        }.bind(this))
        }
        }
        var obj1=new foo;
        obj1.events();
</script>
</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值