this指向

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 永遠指向最後調用它的那個對象

相關文章
相關標籤/搜索