apply(null, ...) apply为什么绑定null

394 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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)的区别

image.png

image.png

  • 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函数。

image.png

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) 可以求最大最小值