call 和 apply 理解前提要明白 this
書上說的是: 改變this指向(看起來很高深)
步入正題:
一般情況下, 我們定義一個函數:
function test () { console.log(123); }
然后會這樣去調用:
test() // 打印123
但是你還可以試試這樣調用:
test.call() // 效果和直接調用一樣, 其實這才是JS內部調用函數的方式. apply() 一樣
所以, 可以把 call 當作一個對象方法
如果沒有參數默認就是直接執行函數,
參數可以是一個, 或者多個
一個的話 :
就是書上說的改變 this 指向, 把函數內部所有的 this 變成那個參數
如果是多個參數 :
第一個當作 this 指向, 其余的當作參數傳遞
舉個栗子 :
定義一個構造函數:
function Person (name, age) { this.name = name; this.age = age; }
可以這樣用:
var person1 = new Person('洋哥', 20);
也可以這樣用:
var person2 = {}; Person.call(person2, '洋哥', 20) // 效果和上面的一模一樣
// person2 對象傳入, 並且執行 Person 構造函數
apply() 和call() 一模一樣, 只是call 傳入參數方式是直接傳入
apply() 就兩個參數, 第一個是 this 指向, 第二個是一個數組, 里面是參數