一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第23天,点击查看活动详情。
func.apply(thisArg , [ argsArray])
//例如
fun.apply(this, ['eat', 'bananas']) // 数组字面量(array literal)
fun.apply(this, new Array('eat', 'bananas')) // 数组对象
fun的this指向thisArg,null则指向全局
调用有指定this
值和参数的函数的结果。
-
thisArg
必选的。在
func
函数运行时使用的this
值。请注意,this
可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为null
或undefined
时会自动替换为指向全局对象,原始值会被包装。 -
argsArray
可选的。一个数组或者类数组对象,其中的数组元素将作为单独的参数传给
func
函数。如果该参数的值为null
或undefined
,则表示不需要传入任何参数。从ECMAScript 5 开始可以使用类数组对象。
[返回值]
调用有指定this
值和参数的函数的结果。
[描述]
在调用一个存在的函数时,你可以为其指定一个 this
对象。 this
指当前对象,也就是正在调用这个函数的对象。 使用 apply
, 你可以只写一次这个方法然后在另一个对象中继承它,而不用在新对象中重复写该方法。
你也可以使用 arguments
对象作为 argsArray
参数。 arguments
是一个函数的局部变量。 它可以被用作被调用对象的所有未指定的参数。 这样,你在使用apply函数的时候就不需要知道被调用对象的所有参数。 你可以使用arguments来把所有的参数传递给被调用对象。 被调用对象接下来就负责处理这些参数。
从 ECMAScript 第5版开始,可以使用任何种类的类数组对象,就是说只要有一个 length
属性和(0..length-1)
范围的整数属性。例如现在可以使用 NodeList
或一个自己定义的类似 {'length': 2, '0': 'eat', '1': 'bananas'}
形式的对象。
Array.apply(null,Array(3))与Array(3)的区别
Array(3)
:创建一个 length 为 3 的数组,可以在console.log()中看到显示的是[empty * 3],是空的。但是JavaScript会自动为数组的每一项赋值 undefined ,而这个 undefined 和 我们自己手动赋值的undefined 有点不一样。可以理解为JavaScript自动赋上的 undefined 相当于为数组的每个值霸个位置,日后方便我们的使用。不能调用map函数。
Array.apply(null, {length: 3})
:已这种方式创建出来的数组,数组中的每一项一创建出来就被初始化为 undefined
,类似于Array.from({length: 3})
,而不仅仅是霸个位置那简单。能调用map函数。
apply使用场景
用 apply
将数组各项添加到另一个数组
push
: 如果push
的参数是数组,它会将该数组作为单个元素添加,而不是将这个数组内的每个元素添加进去concat
: 创建并返回一个新数组push.apply
: 将元素追加到现有数组.
var array = ['a', 'b'];
var elements = [0, 1, 2];
array.push.apply(array, elements); //返回array的长度,array为 ["a", "b", 0, 1, 2]
apply.push(elements) // 返回array的长度,array为["a", "b", 0, 1, 2, Array(3)]
array.concat(elements)// 返回新数组,array为["a", "b", 0, 1, 2, Array(3), 0, 1, 2]
Math.max.apply(null,arr)的解释
其中第一个参数null,这个是因为没有对象去调用这个方法
,所以直接传递null过去。
window可以说是全局对象,就是最顶层的对象,所有全局的变量和函数方法全部都被绑定在window对象身上。
那么Math.max.apply(null, [a, b, c, d, …])
实际上等同于Math.max(window, [a, b, c, d, …])
也就是Math.max(a, b, c, d, …)
因此能够说明为什么 Math.max.apply(null,arr) 可以求最大最小值