javascript中的this, call, apply

thisjavascript

this能夠意爲這時,javascript又是一門運行時的語言,因此咱們來看看this在不一樣的狀況下的含義java

  • 處於被對象調用的方法中
  • 處於普通函數中
  • 在構造函數中

this的指向用簡單的話來講就是數組

誰調用,就指向誰

先看 處於被對象調用的方法中app

var obj = {
    name: '二狗子',
    bark: function(){
        console.log(this);   ==> obj  //    很明顯,調用者是obj,按照上面的簡單規則 「誰調用就指向誰」 因此這裏的this == obj
        console.log('汪汪汪');
    }
};

obj.bark();

再來 處於普通函數中函數

var obj = {
    name: '二狗子',
    bark: function(){
        console.log(this);  ===> window //  不要覺得bark在obj裏面定義的,因此this就是obj,記住javascript是在運行時才能肯定的,可是這裏等於window,也許會讓人有點意外,可是若是你知道了全局環境下全部的屬性方法都是於window就不會奇怪了,因此這裏其實隱藏了一個window,因此實際上是window.bark();這樣調用的,在參照 「誰調用就指向誰」 因此這裏的this == window
        console.log('汪汪汪');
    }
};

// 注意前面沒有加obj
bark();

接着 在構造函數中this

構造函數其實跟普通函數沒有任何區別,在沒有使用new修飾符的時候,函數就是函數,只有加了new後,函數纔是一個構造函數,是new賦予了函數的特殊能力讓其進化成了構造函數code

func1和func2都是普普統統的函數
function func1(){}
function func2(){}

new func1();  // 嘭,一瞬間,func1有了新的使命,他成了一個構造函數

那麼構造函數有什麼用呢? 用處就是,他會返回一個對象對象

function func1(){
    this.name = '一號狗子';
}
function func2(){
    this.name = '二號狗子';
}

var dog = new func1();  // dog1得到了一個對象
var dog =     func2();  // dog2什麼都沒有,由於函數沒有返回任何東西

當對函數使用new修飾符時,函數的內部的this的指向則是返回的那個對象,這是js引擎的背後的行爲

call apply
call和apply說白了就是改變this指向的兩個方法,這兩個方法屬於function類型,因此只要一個變量的原型鏈上有function,那麼它就有call和apply方法
既然說道改變this指向,怎麼改變呢?ip

咱們回到第一個例子,這裏的this咱們已經知道了是指向obj,能改變嗎?能,試試apply原型鏈

var obj = {
    name: '二狗子',
    bark: function(){
        console.log(this);   ==> obj
        console.log('汪汪汪');
    }
};

obj.bark();

// 第一個參數是你須要將this改指 的變量,後面則是須要傳給func的參數,這裏咱們沒有給bark傳,因此沒寫
// func.apply(context, arg...)
obj.bark.apply(window);

就這麼簡單,call也是同樣的使用方式,只是call和apply處理傳入參數的方式有一小點區別,
就是call()方法接受的是一個參數列表,而apply()方法接受的是一個包含多個參數的數組。

相關文章
相關標籤/搜索