#this:數組
this(執行上下文): 【this的指向問題,個人看法就是三個字「肇事者」,狀況有不少種,可是咱們要撥開迷霧,找到‘兇手’】。 如今你就是沒有小蘭的柯南,真想只有一個!app
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,知道找到爲止。
(箭頭函數就是一個「變種人」,並且不是金剛狼的那種。)
複製代碼