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()
方法接受的是一個包含多個參數的數組。