1. 程式人生 > 其它 >JavaScript中的this指向

JavaScript中的this指向

首先,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,
    //但是不論是window還是undefined都沒有對應的name屬性,因此為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.事件監聽與動態繫結一致,不做贅述。