JavaScript中的this指向
阿新 • • 發佈:2021-12-07
首先,this是JavaScript語言中的一個關鍵字。解析器在呼叫函式時每次都會向瀏覽器傳遞進一個隱含的引數,這個隱含引數,就是this。
this指向的是一個物件,這個物件我們稱為函式執行的上下文物件,根據函式的呼叫方式不同,this會指向不同的物件!!!
相信很多JavaScript戰線的朋友在討論this指向時都會說的一句話就是:哪裡呼叫的函式,this就指向哪裡。
確實,這一句話非常言簡意賅,但是偏偏就是太過簡單導致有些剛接觸的朋友有些不知所云,下面我會不同情況不同分析。
1.全域性上下文
console.log(this); //window
'use strict'; console.log(this); //undefined
對於全域性上下文,this的指向分為兩種,一種是你在使用嚴格模式(‘use strict’)時this指向undefined,一種是非嚴格模式時this指向window物件。
2.隱式繫結
var obj={ myName:"薰悟空", sayName:function(){ console.log(this.myName) } } var say=obj.sayName; obj.sayName(); //薰悟空 say();//undefined,因為此時函式的呼叫的位置是全域性上下文,因此this按照是否嚴格模式的規則存在兩種情況,一種指向window,一種指向undefined,3.顯示繫結(利用call,apply,bind方法進行修改作用域)
var obj={ myName:"薰悟空", } function say(){ console.log(this.myName) } say(); //undefined 此時呼叫的方法屬於全域性作用域,而全域性作用域中不存在myName屬性,因此為undefined say.call(obj); //薰悟空 因為此時say函式內部作用域已經不是全域性作用域,而是被call方法繫結過來的obj物件
具體call,apply,bind方法怎麼用,有什麼區別請看我後面的文章,此處不做衍生。
4.建構函式繫結
function Hou(){ this.myName="薰悟空" } var hou1=new Hou(); //此時建構函式觸發,將this強制改變為新建立的例項物件obj,是JavaScript的語法規則,不需要理解 console.log(hou1.myName); //薰悟空
5.事件繫結(行內繫結,動態繫結,事件監聽)
a.行內繫結:this指向window
<input class="name" onclick="changeName"> <script> function changeName(){ console.log(this); } //因為執行在全域性上下文中,所以this指向window </script>
b.動態繫結:this指向元素本身
<input class="name"> <script> var doc=document.getElementsByClassName('name')[0]; doc.onclick=function(){ console.log(this); } //此處的this指向該元素節點本身 </script>
c.事件監聽與動態繫結一致,不做贅述。