在javascript國,有個關於this
之劍的傳說,誰做爲調用點,誰就是this
的主人。javascript
調用點是什麼?調用點就是函數在代碼中被調用的位置。java
函數是javascript國的執法人員,做爲一我的民公僕,固然是哪裏須要搬哪裏,而他執法須要一些震懾別人的武器,this
之劍就這樣誕生了。
可是函數不能時時刻刻都拿着武器走在大街上吧,因此javascript國法律規定,只有在執法(被調用)的時候this
之劍才起做用。數組
你認爲this
之劍是屬於函數的?那就大錯特錯了,想一想咱們剛纔說的,調用點纔是this的主人,那麼誰是調用點呢?能調用函數的人還用說嗎?固然是javascript國最大的官window
了。app
不信你試試函數
let name = 'window' function fn() { let name = 'function' console.log(`I am ${this.name}`) } fn() // I am window
難道只有全部this
的主人都是window
了嗎?那倒不是,window
做爲大佬,手下沒些小弟那怎麼成,
對象就是window
的忠實小弟this
name = 'window' const obj = { name: 'obj', fn: function () { console.log(`I am ${this.name}`) } } obj.fn() // I am obj
但有時候,對象旗下的函數能力有限,須要藉助window
的函數,做爲window直屬的函數就不樂意了:「我明明是大佬直屬的部下,爲何要被你個小小的對象調用,我不服。」因而,window
直屬的函數就會給對象使絆子,發泄本身的不滿,只要是須要this
之劍的時候,直屬函數就百般刁難。code
const someThing = 'relax' function windowFn() { console.log(`let me do ${someThing}`) } const obj = { someThing: 'work', objFn: windowFn, } obj.objFn() // let me do relax
這可怎麼辦啊,對象也不是吃素的,你有張良計,我有過牆梯。
對象決定告狀!window
聽了這種事,思索了一下,決定使用美人計,window
給每一個函數分配了call
,apply
兩個美女函數部下,
這美人計還真有用,每一個函數都成了裙下之臣,乖乖執行對象佈置的任務。對象
const someThing = 'relax' function windowFn() { console.log(`let me do ${someThing}`) } const obj = { someThing: 'work', objFn: windowFn, } obj.objFn.call(obj) obj.objFn.apply(obj)
說到這兩大美女啊,各有各的喜愛,雖然作同樣的任務,可是收參數的方式卻不太同樣,call
喜歡一個一個收,apply
喜歡打包成數組一塊兒收。ip
關於this之劍傳說咱們暫時先說到這吧,欲知後事,下回分解。io