this 的指向,始終堅持一個原理:this 永遠指向最後調用它的那個對象
若是沒有調用的對象,那麼調用對象就是全局對象window。函數
須要注意的是,這裏咱們沒有使用嚴格模式,若是使用嚴格模式的話,那麼全局對象就是 undefined,就會報錯 Uncaught TypeError: Cannot read property 'name' of undefinedthis
下面咱們來看一個簡單的例子:
例 1:code
var str = "hello"; function a() { var str = "world"; console.log(this.str); // hello function b() { var str = "hello world"; console.log(this); //Window } b(); } a(); console.log(this); //Window
首先看調用 a 的地方 a();由於a前面沒有調用的對象,也就是至關因而 window.a(),即a的this指向了window
第一個console.log輸出hello,由於this指向了window,因此this.str獲取到的值就是window下的hello,而並非a方法中的world
而後咱們在a方法裏面,又有定義了一個b方法,而且執行b方法
第二個console.log打印了b方法中的this
這個this其實仍是指向window對象,雖然b在a的裏面,但其實調用b方法的仍是window對象
最後一個console.log打印的也是Window,由於其實是Window.console.log對象
再看下這個例子:
例 2:io
var str = "hello"; var a = { str: "world", fn : function () { console.log(this.str); // world } } a.fn();
在這個例子中,函數 fn 是對象 a 調用的,即this指向了a,因此打印的值就是 a 中的 str 的值。是否是有一點清晰了呢~console
繼續看下面這個例子function
例 3:class
var str = "hello"; var a = { str: "world", fn : function () { console.log(this.str); // world } } window.a.fn()
這裏打印 world的緣由也是由於咱們以前說的那句話this 永遠指向最後調用它的那個對象,這裏也就是a變量
咱們再來看一下這個例子:
例 4:原理
var str = "hello"; var a = { // str: "world", fn : function () { console.log(this.str); // undefined } } window.a.fn();
這裏爲何會打印 undefined 呢?這是由於調用 fn 的是 a 對象,而對象 a 中並無對 str 進行定義,因此咱們打印的 this.str的值是undefined
這個例子仍是說明了:this 永遠指向最後調用它的那個對象,因此就算 a 中 沒有 str 這個屬性,也不會繼續向上一個對象尋找 this.str,而是直接輸出 undefined
最後看一個比較坑的例子:
例 5:
var str = "hello"; var a = { str: "world", fn : function () { console.log(this.str); // hello } } var f = a.fn; f();
這裏你可能又會有疑問,爲何不是 world?
這是由於雖然將 a 對象的 fn 方法賦值給變量 f 了,可是此時並無調用, 而是經過fn()去調用的,而fn()是被 window 調用的。因此 this 指向的也就是 window
由以上五個例子咱們能夠看出,this 的指向並非在建立的時候就能夠肯定的,this 永遠指向最後調用它的那個對象。