1.介绍
javascript的一大特点是,函数存在[定义时上下文]和[运行时上下文],以及[上下文是可以改变的]这样的概念,apply,call 都是为了改变函数运行时上下文(context)存在的,既改变函数体内部 this 的指向。bind更改函数的this并返回新函数,可以传参。
Function.prototype.apply()
Function.prototype.call()
Function.prototype.bind()
2. apply
语法
func.apply(thisArg,[argsArray])
描述
在调用一个存在的函数时候,你可以为其指定一个 this 对象,this 指当前对象,也就是正在调用这个函数的对象。使用apply , 你可以只写一次这个方法,然后在另外一个对象中继承它,而不是用在新对象中重复写该方法。
参数
thisArg :可选的。在函数func运行时使用this的值。注意,this可能不是该方法看到的实际的值:如果这个函数在 非严格模式 下,则指定为 null 或 undefined 时,会自动替换为指向 全局对象 , 原始值会被包装。
argsArray : 可选的。一个数组 或 类数组 对象,其中的数组元素将作为单独的的参数传给 func 函数,如果改参数的值为 null 或者 undefined,则表示不需要传入任何参数。
案列
1.用apply将数组添加到了一个数组
var arr1 = [1,2]
arr1.push(3);
arr1.push(4,5);
console.log(arr1) // [1,2,3,4,5]
var arr2 = [6,7,8]
arr1.push(arr2);
console.log(arr1) // [1, 2, 3, 4, 5, Array(3)]
我们可以使用push 将元素追加到数组中。并且,因为push接受可变数量的参数,我们也可以 一次推送多个元素。但是,如果我们传递一个数组来推送,它实际上会将该数组作为单个元素添加,而不是单独添加元素,因此我们得到的是一个数组内的数组。
var arr1 = [1,2,3];
var arr2 = [2,3,4];
var arr3 = arr1.concat(arr2);
console.log(arr3); // [1,2,3,2,3,4]
concat 确实具有我们想要的效果,但它并不是附加到现有数组,而是创建并返回一个新数组,但是我们想要附加到我们现有的阵列...那么现在呢?写一个循环?当然不是,我们可以利用apply 实现。
var array = ['a','b'];
var element = [0,1,2];
array.push.apply(array,element);
console.log(array); // ['a','b',0,1,2]
2.使用apply和内置函数
聪明的apply用法允许你在某些本来需要写成遍历数组变量的任务中使用内建的函数。如下面的 利用Math.max/Maxt.min 求一个数组中的最大/最小值。
var number = [5,6,2,3,7];
var max = Math.max.apply(null,number)
var min = Math.min.apply(null,number)
基本等同于
Math.max(number[0],number[1],...) 或 Math.max(5,6,...)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。