apply() 与 call() 用法浅析

apply()call() 作为所有函数的方法,定义为:在指定this值与参数的情况下调用某个函数或方法。两者的区别是:call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组

这两个方法的关键点在于指定this与参数,所以我们以此为切入点,看看在实际的工作中有哪些用法。

使用apply()支持可变参数

所有的语言,有一些我们经常要做的事情,似乎都被语言的开发人员莫名其妙的忽略了,JavaScript 也不例外。比如查找数组中的最小值与最大值。在 JavaScript 中似乎没有这两种功能,但如果随意探索的话,可能会发现Math对象有两个名为min()max()的方法。

一开始我们认为,这些方法可能就是我们想要的答案,但测试以后,我们发现第个方法都需要可变长度的参数列表,而不是数组。这根本不能满足我们的需求,也就是说,Math.max()的调用,需要像下面这样:

如果我们要得到数组的最大值,意味着我们要这样传参:

这种方法的前提是我们知道数组的大小,即使我们知道数组的大小,实际操作的时候也会遇到各种问题,比如数组长度很大的时候,所以这终究不是一个令人满意的解决方案。

在放弃Math.min()与Math.max()之前,让我们仔细思考,发散思维,想想看是否有一种简单的方式,支持将数组作为一个可变长度的参数列表

apply()恰恰支持我们所需要的功能。

让我们来看看如何利用这个方法的优势来定义面向数组切面的函数:

运行结果:
array_min_max

上述代码中,我们将Math对象指定为上下文。这是没有必要的(不管是什么上下文,min()max()都能正常使用),为了操持代码整洁,所以将Math对象指定为上下文。

arguments进行slice等操作

所有函数都会隐式传递 arguments 参数,包含当前函数的所有实参。arguments 是一个类数组对象,如果希望使用数组的内置方法操作 arguments,我们可以借助于apply()call()方法:

运行结果:
argumetns_apply_call