func.apply(thisObj, [argArray] );
apply方法用來改變函式執行時的this指向,後面的引數是一個類陣列物件,可以是陣列,arguments,甚至一個有length屬性的物件 { length: 3 }
apply有一個重要的作用,就是可以將 陣列引數 轉換為 引數列表,也就是可以 對一個陣列應用原本只支援引數列表的函式。
例如:
Math.max(param1, param2....)
Array.prototype.push(param1, param2...)
Array.prototype.concat(param1, param2...)
這些只支援引數列表的函式,不能直接傳入陣列,但是通過apply方法,就可以將一個陣列傳進去,得到該陣列作為引數的結果。
//apply傳入null,則轉換為全域性物件,window或global Math.max.apply(null, arr) <=> global.max(arr[0], arr[1], arr[2] .....) //這裡的null只是佔位,傳入任何值都行,max和min函式中this不起作用,傳個123,結果也一樣 Math.min.apply(null, arr) <=> global.min(arr[0], arr[1], arr[2] ......) //注意concat後面的arr2不是以整體的形式去連線,而是以打碎的形式去連線 Array.prototype.concat(arr1, arr2) <=> arr1.concat(arr2[0], arr2[1], arr2[3] ......) Array.prototype.push(arr1, arr2) <=> arr1.push(arr2[0], arr2[1], arr2[3] ......)
總之,apply就是將後面的陣列引數打碎傳入函式呼叫。
下面是一個經典的利用apply對陣列降維的例子:
Array.prototype.concat.apply([], arr2d)
一個空陣列,apply呼叫concat,將後面的二維陣列打碎,concat本身又將一維陣列打碎,連線成一個一維陣列。
過程如下:
Array.prototype.concat.apply([], arr2d) <=> [].concat(arr2d[0],arr2d[1],arr2d[2]...) //arr2d[0],arr2d[1],arr2d[2]...本身也是陣列,會被concat再次打碎,合併進前面的空陣列,這樣 //經過兩次打碎,一個二維陣列就降維成一個一維陣列