图解call、apply、bind的异同及各种实战应用演示

一、图解call、apply、bind的异同

JavaScript中函数可以通过3种方法改变自己的this指向,它们是call、apply、bind。它们3个非常相似,但是也有区别。下面表格可以很直观看出三者的不同

方法是否直接执行函数传入的参数调用方式
call

(context,arg1,arg2,arg3...)

第二个参数之后都是实参

function.call(context,arg1,arg2,arg3...)

apply

(context,[arg1,arg2,arg3...])

第二个参数必须是数组

function.apply(context,[arg1,arg2,arg3...])

bind

(context,arg1,arg2,arg3...)

第二个参数之后都是实参

var newFunction = function.bind(context);

newFunction(arg1,arg2,arg3...)

二、实例:

1、call

var a = {x: 1};
    var b = function (y, z) {
        console.log(this.x + y + z)
    };
    b.call(a, 3, 4);//此时b的this(即b执行时的上下文)被改变为a,因此this.x为1,第二个参数之后都是传给b实参。

2、apply

 var a = {x: 1};
    var b = function (arr) {
        console.log(this.x + arr[0] + arr[1])
    };
    b.call(a, [3, 4]);//此时b的this(即b执行时的上下文)被改变为a,第二个参数是一个数组

3、bind

var a = {x: 1};
    var b = function (y, z) {
        console.log(this.x + y + z)
    };
    var newB = b.bind(a);//此时b的this(即b执行时的上下文)被改变为a,由此生成一个新函数,函数不会立即执行。
    newB(3, 4);//函数此时才执行

 三、常用场景

1、数组之间追加

var array1 = [12, "foo", {name: "Joe"}, -2458];
    var array2 = ["Doe", 555, 100];
    Array.prototype.push.apply(array1, array2);
    /* array1 值变为  [12 , "foo" , {name:"Joe"} , -2458 , "Doe" , 555 , 100] */

2、获取数组中的最大值和最小值

var numbers = [5, 458, 120, -215];
    var maxInNumbers = Math.max.apply(Math, numbers);  //458
3、验证是否是数组(前提是toString()方法没有被重写过)
function isArray(obj){
        return Object.prototype.toString.call(obj) === '[object Array]';
    }

4、类(伪)数组使用数组方法

var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));


5、数字求和

function sum() {
        var numberSum = Array.prototype.reduce.apply(arguments, [function (prev, next) {
            return prev + next;
        }]);
        console.log(numberSum);
    }
    sum(1, 2, 3);
备注:以上1-4的使用场景来自github,有兴趣的同学可以前往了解更多: https://github.com/chokcoco/apply-call-bind/tree/master

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值