this之劍傳說

this之劍傳說

在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給每一個函數分配了callapply兩個美女函數部下,
這美人計還真有用,每一個函數都成了裙下之臣,乖乖執行對象佈置的任務。對象

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

相關文章
相關標籤/搜索