this在js中起初我覺得是最噁心的 好吧個人感覺 主要太飄忽不定了 後來也看了一些文章說了好多 總結一句話吧
在函式中 this 到底取何值,是在函式真正被呼叫執行的時候確定下來的,函式定義的時候確定不了 就是誰呼叫就指向誰
this這個關鍵字是有明確定義的 就是指代當前物件 當前這個詞感覺就不是一個確定的條件 好像在某種情況下才成立
接著往下看 大牛的可以略過小弟裝逼一波
由於js執行期繫結的特性所以 js的this 情況特別多 廢話不多說了
this三種情況 1. 全域性物件 2. 當前物件 3. 任意物件
要分析這些是那種情況 要根據函式呼叫方式 下面說下函式呼叫方式
- 函式呼叫
- 物件方法
- 建構函式
- 使用call apply
我擦 看到這些個 懵逼不 一個一個來幹下
函式呼叫
function a () { this.n = '123' console.log(this) //window console.log(this.n) //123 } a()複製程式碼
這裡的this 是全域性的物件 把他變化下
var b = '123' function a() { console.log(this) //window console.log(this.b) //123 } a()複製程式碼
我擦 這種普通函式呼叫的時候 this 指向了window
作為物件方法呼叫
var name = 'xiaobai' var Person = { name: 'xiaoming', showName: function () { console.log(this.name) // xiaoming } } Person.showName()複製程式碼
作為物件的方法 當呼叫的時候這裡的this 就是Person
var name = 'xiaobai' var Person = { name: 'xiaoming', showName: function () { console.log(this.name) // xiaobai } } var other = Person.showName other()複製程式碼
哎擦 不是說作為物件的方法呼叫this就指向當前這個物件嗎 咋變了 咋感覺是window啊
原因: 這裡把 Person.showName 賦予給window上的一個變數 showName這個方法作用就是輸入this指向物件上的name屬性 這時候在賦予在window上變數 當other() 實際是在呼叫全域性(window)上的一個方法 相當於最後 window.name 肯定是xiaobai了
作為建構函式
啥叫建構函式這裡就不做詳細展開了 簡單說下 就是通過一個函式生成 (new)一個物件function Person() { this.name = 'xiaoming' } var other = new Person() console.log(other.name) //xiaoming複製程式碼
看到的是 this 指向的就是new 出來的物件 如果不new 哪跟普通函式一樣
call apply
這個call apply 之前說過
apply()是函式物件的一個方法 它應用某一物件的一個方法 用另一個物件替換當前物件var n = 'hello world!' function example(){ console.log(this.n) } var o={}; o.n = 'hey' o.m = example o.m.apply() // hello world! o.m.apply(o) // hey複製程式碼
這裡 當apply() 引數為空的時候 沒有物件來替換當前物件 預設是用全域性(window)來替換
當apply() 有引數的時候 物件替換成功 this指向了o這個物件
總結下 以上就是this在各種情況下的含義 js很牛逼 這裡只是介紹冰山一角 更牛逼的東西 還要我們不斷去學習 (後續基礎文章繼續補充中 可以參考我其他文章看看對你有沒有幫助)