this指向問題一直困擾著我們,隨著後面框架的學習,感覺有些混亂,今天好好總結一下!!
首先要明白兩個問題:
1.this什麼時候確定?
this在函式被呼叫時確定
2.this指向誰?
當前擁有this的函式被誰呼叫,this就指向誰
總結一句話就是:弄清擁有this的函式被誰呼叫
分為以下幾種情形:
1)全域性作用域下
直接列印this,我們可以看到它是指向window
1 console.log(this);//window
宣告乙個函式,如果函式沒有被呼叫,它裡面的this我們是不知道指向的,控制台什麼都沒有輸出
1function
fuc()
如果我們呼叫了,指向的是window
1function
fuc()
4 fuc();
宣告乙個函式並將它賦值給乙個變數,然後呼叫,this指向window
1var func= function
()4 func();
自執行函式:自執行函式就是當它被定義出來,就會自動執行的函式。它的this指向window
1 (function () )();
作為函式呼叫時,不管你怎麼巢狀,指向的是全域性物件,也就是window(
嚴格模式下,this是未定義的(undefined)
)
1var func= function()4
function
say()
8 say();
2)作為物件的方法呼叫時,this指向的是該方法所屬的物件
1var person =3}
4 person.run() //
person
下面來乙個複雜的例子,原理相同:
1var q = 'window'
2var func = function
() 56
var obj =13}
14 func();//
window
15 obj.func() //
obj16 obj.anotherobj.func() //
anotherobj
3)建構函式中this,指向的是建構函式新建立的這個物件。
1function
pro();4}
5var p = new pro();
4)事件繫結中的this,一般情況下是指向接受該事件的元素,當然也有特殊。
事件繫結有:行內繫結,動態繫結,事件監聽。
行內繫結:行內繫結事件的語法是在html節點內,以節點屬性的方式繫結。
注意加粗部分:當事件觸發時,屬性值就會作為js**被執行,相當於函式呼叫。
12789
動態繫結和事件監聽原理相同:為節點物件的屬性重新賦值乙個匿名函式。
12
5)window定時器中的this
1
setinterval() 方法可按照指定的週期(以毫秒計)來呼叫函式或計算表示式。第乙個引數要呼叫乙個**串,也可以是乙個函式。
setinterval(obj.fun,1000)
的第乙個引數是obj
物件的fun
,在 js 中函式可以被當做值來做引用傳遞,實際就是將這個函式的位址當做引數傳遞給了setinterval
方法,換句話說就是setinterval
的第一引數接受了乙個函式,那麼此時1000毫秒後,函式的執行就已經是在window物件下了,也就是函式的呼叫者已經變成了window物件,所以其中的this則指向的全域性window物件;
而在setinterval('obj.fun()',1000)
中的第乙個引數,實際則是傳入的一段可執行的 js **;1000毫秒後當 js 引擎來執行這段**時,則是通過obj
物件來找到fun
函式並呼叫執行,那麼函式的執行環境依然在 物件obj
內,所以函式內部的this也就指向了obj
物件。
6)箭頭函式是乙個普通函式:
1var a = 0
2var test = ()=>
test();//0
this
總是指向詞法作用域,也就是該例中的外層呼叫者window:
箭頭函式是物件的方法:
1var a = 0
2var obj =7}
89 obj.foo() //
0
解析上述**:
vara =0;如果想要讓this指向obj這個物件我們可以這樣修改varobj =newobject;obj.a =1;obj.foo =()=>obj.foo()
由於箭頭函式不繫結this, 它會捕獲其所在(即定義的位置)上下文的this值, 作為自己的this值,foo在全域性中定義,所以this指向window。
1var a = 0
2function
foo()
6return
func7}
8var obj =
12 obj.foo()() //
1
在函式foo()中返回了func(),func()是在foo()被呼叫時定義的,所以箭頭函式func()會把foo()中的this作為自己的this,而foo()是被obj呼叫的,擁有this的函式被誰呼叫this就指向誰,所以foo()的this指向obj,因此箭頭函式中的this指向obj。
箭頭函式是建構函式:因箭頭函式沒有this,固不能用作建構函式,否則會報錯
1var foo = ()=>
4var boo = new foo() //
foo is not a constructor
JS中this指向問題
解析器在呼叫函式時,每次都會向函式內部傳遞進乙個隱含的引數,這個隱含的引數就是this,this指向的是乙個物件,這個物件我們稱之為函式執行的上下文物件,根據函式的呼叫方式不同,this會指向不同的物件.簡單來說一下函式中this指向問題,1.this是什麼?任何函式本質上都是通過某個物件來呼叫的,...
JS中this指向問題
函式內部的this之和函式的呼叫方式有關,和函式的定義方式沒有關係functionfn fn windowvar obj obj.fn obj functionfn 或者可以這樣寫自呼叫函式 functionfn div document.queryselector div div.onclick ...
JS中this指向問題
與其它語言相比,js的this關鍵字的指向稍微有點差別。一 全域性環境 首選我們要明確一點,在全域性環境中 在任意函式體外部 無論是嚴格模式還是非嚴格模式,this都指向window。下面,我們來通過幾個例子理解一下。示例1 console.log this 這裡的this在全域性域下,指向wind...