call和apply其實是同一個東西,區別只有引數不同,call是apply的語法糖。
如果你願意的話,所有函式呼叫的時候,都可以使用apply,任何時候都可以用,完全不存在“不知道怎麼用”這種情況,因為只要你呼叫一個函式的時候,就可以用,任何時候,任何函式,隨便用。
但是這樣好像沒有意義,題主希望知道的是,什麼時候才是一個恰當的場景對吧,那我們來分析一下,用call或者apply呼叫函式和直接呼叫函式有什麼區別。
函式作用域中的“this”,就像我們文章裡的“我”一樣。語文老師告訴我們,引號我,不是我,他可以是任何人,比如是作者,可以是讀故事的人,或者是某個特定的人。
我們通常使用的函式有兩種。一種是作為某個物件的方法,一種是作為獨立的函式。
當作為物件方法的時候,函式中的this往往指的都是呼叫它的物件。而如果是一個獨立函式,我們通常不會在其中使用this。
這就是為什麼題主不知道如何應用apply,因為通常我們遇到的都是上面的兩個場景,這時候確實沒有任何使用apply的必要。那什麼時候可以用apply呢?
第一種就是這個函式作為某個物件的方法,但是卻不被這個物件呼叫。比如我們用過
這時候的this並不是一個Array,因為需要借用Array類的方法,所以使用了call。
另外一個場景是就是聲明瞭一個帶有this的函式,根據傳入不同的物件可能做一點不一樣的操作。
在純粹的面向物件程式設計中,我們應該是可以繞開call來實現各種功能的,換句話說,如果js語言中並沒有這個方法,大概我們也可以正常的上班吧。
難以理解或者無法熟練運用某個技術,一定是因為沒有遇到適合的場景。最好的途徑還是有前輩能夠拿著程式碼來告訴你,這裡用了call之後為什麼變得更好了。自己按照一直以來的程式設計思路,可能走了很久也不會走到有call的這條路上。
如果是要做框架類的東西,或許會比較容易遇到。距離提問已經五年了,我猜題主應該已經找到答案了吧。
call和apply其實是同一個東西,區別只有引數不同,call是apply的語法糖。
如果你願意的話,所有函式呼叫的時候,都可以使用apply,任何時候都可以用,完全不存在“不知道怎麼用”這種情況,因為只要你呼叫一個函式的時候,就可以用,任何時候,任何函式,隨便用。
但是這樣好像沒有意義,題主希望知道的是,什麼時候才是一個恰當的場景對吧,那我們來分析一下,用call或者apply呼叫函式和直接呼叫函式有什麼區別。
函式作用域中的“this”,就像我們文章裡的“我”一樣。語文老師告訴我們,引號我,不是我,他可以是任何人,比如是作者,可以是讀故事的人,或者是某個特定的人。
我們通常使用的函式有兩種。一種是作為某個物件的方法,一種是作為獨立的函式。
當作為物件方法的時候,函式中的this往往指的都是呼叫它的物件。而如果是一個獨立函式,我們通常不會在其中使用this。
這就是為什麼題主不知道如何應用apply,因為通常我們遇到的都是上面的兩個場景,這時候確實沒有任何使用apply的必要。那什麼時候可以用apply呢?
第一種就是這個函式作為某個物件的方法,但是卻不被這個物件呼叫。比如我們用過
這時候的this並不是一個Array,因為需要借用Array類的方法,所以使用了call。
另外一個場景是就是聲明瞭一個帶有this的函式,根據傳入不同的物件可能做一點不一樣的操作。
在純粹的面向物件程式設計中,我們應該是可以繞開call來實現各種功能的,換句話說,如果js語言中並沒有這個方法,大概我們也可以正常的上班吧。
難以理解或者無法熟練運用某個技術,一定是因為沒有遇到適合的場景。最好的途徑還是有前輩能夠拿著程式碼來告訴你,這裡用了call之後為什麼變得更好了。自己按照一直以來的程式設計思路,可能走了很久也不會走到有call的這條路上。
如果是要做框架類的東西,或許會比較容易遇到。距離提問已經五年了,我猜題主應該已經找到答案了吧。