javascript的一大特色是,函数存在[定义时上下文]和[运行时上下文],以及[上下文是能够改变的]这样的概念,apply,call 都是为了改变函数运行时上下文(context)存在的,既改变函数体内部 this 的指向。bind更改函数的this并返回新函数,能够传参。javascript
Function.prototype.apply() Function.prototype.call() Function.prototype.bind()
语法
func.apply(thisArg,[argsArray])
描述
在调用一个存在的函数时候,你能够为其指定一个 this 对象,this 指当前对象,也就是正在调用这个函数的对象。使用apply , 你能够只写一次这个方法,而后在另一个对象中继承它,而不是用在新对象中重复写该方法。java
参数
thisArg :可选的。在函数func运行时使用this的值。注意,this可能不是该方法看到的实际的值:若是这个函数在 非严格模式 下,则指定为 null 或 undefined 时,会自动替换为指向 全局对象 , 原始值会被包装。数组
argsArray : 可选的。一个数组 或 类数组 对象,其中的数组元素将做为单独的的参数传给 func 函数,若是改参数的值为 null 或者 undefined,则表示不须要传入任何参数。app
案列
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接受可变数量的参数,咱们也能够 一次推送多个元素。可是,若是咱们传递一个数组来推送,它实际上会将该数组做为单个元素添加,而不是单独添加元素,所以咱们获得的是一个数组内的数组。this
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 实现。prototype
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 求一个数组中的最大/最小值。code
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,...)