call、apply、bind的区别?(面试题-JavaScript部分)

共同点:

                可以改变this指向

                语法: 函数.call()、函数.apply()、函数.bind()

不同点:

                1. call、apply可以立即执行

                    bind不会立即执行,因为bind返回的是一个函数需要加入()执行。


                2. 参数不同:

                                apply第二个参数是数组

                                call和bind有多个参数需要挨个写。

                3.场景:

1. 用apply的情况
        var arr1 = [1,2,4,5,7,3,321];
        console.log( Math.max.apply(null,arr1) )

2. 用bind的情况
        var btn = document.getElementById('btn');
        var h1s = document.getElementById('h1s');
        btn.onclick = function(){
               console.log( this.id );
        }.bind(h1s)

例子:

        · 原本的情况:

        var a = '你好';
        function fun(){
            console.log( this ,this.a )
        }
        fun();      //调用fun函数

                输出结果:

         · 用call改变this指向:

var a = '你好';
var b = {a:'这是b对象内的a'}
function fun(){
       console.log( this ,this.a )
}
        
fun.call(b); //立即执行
fun();      //调用fun函数
fun.apply(b); //立即执行
console.log( fun.bind(b) );  //输出结果是一个函数
fun.bind(b)();               //所以bind不是立即执行,需要加()后才会执行

                输出结果:

         · 参数不同:

        var a = '你好';
        var b = {a:'这是b对象内的a'}
        function fun(name,age){
            this.name = name;
            this.age = age;
            console.log( this ,this.a );
        }
        fun.call(b,'小马',18);
        fun.bind(b,'Kiangkiang',20)();

 

                输出结果:

                · 使用场景:

<body>
    <button id="btn">按一下改变this指向,指向id为h1s</button>
    <h1 id="h1s">222</h1>
    <script>
        
       // 1. 用apply的情况
        var arr1 = [1,2,4,5,7,3,321];
        console.log( Math.max.apply(null,arr1) )

       // 2. 用bind的情况
        var btn = document.getElementById('btn');
        var h1s = document.getElementById('h1s');
        btn.onclick = function(){
            console.log( this.id );
        }.bind(h1s)
    </script>
</body>

                 输出结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值