淺談javascript中的call與apply方法
call方法與apply方法都是為了改變函數體內部this的指向。
call方法與apply方法,這二者的作用完全一樣,只是接受參數的方式不太一樣。
apply()方法:
Function.apply(obj,args)
obj將代替Function裏的this對象。
args表示一個數組或者類數組。apply方法把這個集合中的元素作為參數傳遞給被調用的函數
call()方法中的第一個參數與apply方法一樣,只不過第二個參數則是一個參數列表。
這裏有一點要強調的是,在非嚴格模式下,當我們第一個參數傳遞為null或undefined時,函數體內的this會指向默認的宿主對象,在瀏覽器中則是window
下面來舉一個call與apply方法的小例子。
這個例子也許比較簡單,再來舉另外一個例子:
再來說另外一個知識點。曾經我以為arguments是一個數組,可是今天我才發現,我錯了,arguments其實是一個類數組,這裏用實例來說明。
可以看出arguments並不具有push方法。
那麽什麽是類數組呢?類數組具有以下條件:
(1)、具有length屬性。
(2)、按索引方式存儲數據。
(3)、不具有數組的push、pop等方法。
如果這裏非要使用push方法,我們可以使用call或者apply方法,那麽上面的例子可以稍加修改。
總結:
(1)、每個函數都包含兩個非繼承而來的方法,即call()方法與apply()方法。
(2)、call()方法與apply()方法作用相同,都是在特定的作用域中調用函數。
(3)、接收參數方面不同,apply()接收兩個參數,一個是函數運行的作用域(this),另一個是參數數組。而call()方法第一個參數與apply()方法相同,但傳遞給函數的參數必須列舉出來。
淺談javascript中的call與apply方法