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,...)