#this:
this(執行上下文): 【this的指向問題,我的見解就是三個字“肇事者”,情況有很多種,但是我們要撥開迷霧,找到‘凶手’】。 現在你就是沒有小蘭的柯南,真想只有一個!
1.在全域性作用域:this就是window。
2.在函式內,this是誰,取決於函式的呼叫方式:
2.1 如果函式是直接呼叫的,函式內的this就是window
2.2如果函式是以物件的方法呼叫的(如:xxx.func()),函式內的this就是方法前的物件(前例中的xxx).
[誰呼叫函式就指向誰,就像是蚊子叮了你,你總要找到那個肇事者]
***注意***
1)每個函式都有自己的this指向。所以進入函式後,this隨著函式的呼叫方式變化,this也是變化的。而且this的指向,不取決於定義在哪,而是取決於函式是誰呼叫的。
var fullname = "Iron man";
【喜歡鋼鐵俠的請你點個贊】
function hello(str) {
console.log(`我就是${this.fullname},${str}`)
}
hello("鋼鐵俠最cool") //函式內的this就是window
var p = {
fullname:"Captain America",
hello:function() {
console.log(`你好,我叫${this.fullname}`)
}
}
p.hello();
var hi = p.hello() //全域性定義了一個變數hi,將p物件的屬性hello的值給了hi
hi() //this是window【不要被誤導,這是直接呼叫】
p.hi = hello
p.hi("world") //this就是p
3.強行改變this的指向【俗稱掰彎this,難道這說明以前this是直的?】
call是函式物件自己方法
hello.apply(this想指向的物件,[傳給hello的引數們])
hello.call(this指向的物件,傳給hello的第一個引數,傳給hello的第二個引數......)
***注意***
呼叫函式的方法apply與call時,引數是馬上執行的。另外apply第二個引數是陣列。
bind呼叫時,函式是不會立馬執行的,它比較調皮,返回的是一個新函式,新函式的this,就是你剛才bind的物件。
比如說:
var newFunction = hello.bind(this指向的物件);
【新函式內,this就是bind的引數】
//呼叫全域性的hello,讓hello內的this指向p
hello.apply(p,["我是一個陣列"])
hello.call(p,"我不是陣列")
var newHello = hello.bind(p)
newHello("希望大家喜歡我的部落格")
4.建構函式內的this,在new時,建構函式內的this,指向新建立的物件,new前面的那個“帥哥”。
5.箭頭函式,沒有自己的this。如果在箭頭函式中出現了this,會像父級作用域找this,知道找到為止。
(箭頭函式就是一個“變種人”,而且不是金剛狼的那種。)
複製程式碼