工做有那麼一段時間了,可是在工做中,發現本身的理論知識仍是有所欠缺。特別是在javascript上,不少東西其實本身屬於知道要用這個,可是不知道爲何要這麼用...這種狀況非常尷尬了,因此寫博客的很重要一個目的就是鍛鍊我本身的總結能力,把學到的東西總結出來,感受這樣能讓我更快的去理解所學到的東西。javascript
剛開始作前端的時候仍是以完成功能爲主,因此忽略掉了理論知識的重要性,可是隨着工做的慢慢深刻,發現不少原理仍是要創建在對理論知識的理解與掌握上。前端
做爲一個合格的前端工程師,這個確實有點不能忍...因此仍是要沉下心來,一點點的去提高本身。話說回來,其實javascript的理論在我看來並無那麼的枯燥難懂,可是須要你去實驗、去調試。興趣永遠是學習最好的動力,我想保持這份興趣,持續的去研究javascript的理論,去探尋其中的祕密和讓人驚歎的地方。java
閒話扯了那麼多,但願各位看官不要在乎...只是本人一點點心聲罷了...言歸正傳,關於this,其實在我看來確實算是javascript中很基礎、很重要、也是很難理解的一個點;數組
this的定義,藉助下阮一峯大大的總結,感受比較好理解些:瀏覽器
function test(){ this.x = 1; }
其實this之因此難以理解,主要就是在不一樣狀況下,this的指向都是不同的。如下幾種狀況,基本概括了常見的this的指向:前端工程師
console.log(this);//輸出window function foo(){ console.log(this); } foo();//輸出window
var obj = {name:'test'}; function foo(){ console.log(this); } foo.call(obj);//輸出obj foo.apply(obj);//輸出obj
var arr1 = [1, 2 , 3], arr2 = [4, 5, 6]; Array.prototype.push.apply(arr1, arr2); console.log(arr1);//輸出[1, 2, 3, 4, 5, 6]
var obj = {name:'test'}; function foo(){ console.log(this); } obj.foo = foo; obj.foo();//輸出obj
function C(){ this.name = 'test'; this.age = 18; console.log(this); } var c = new C();//輸出 c console.log(c);//輸出 c
上述四種狀況基本概述了this的常見指向,可是也有些特殊的狀況下,this的指向並不在上訴的範圍中:app
這個方法會建立一個函數實例,其this值會被綁定到傳給bind()函數的值。也就是說會返回一個新函數,而且使函數內部的this指向爲傳入的第一個參數:函數
window.color = 'red'; var o = {color : 'blue'}; function sayColor(){ alert(this.color) } var objectSayColor = sayColor.bind(o); objectSayColor();//blue
b.eval學習
對於eval函數,其執行時候彷佛沒有指定當前對象,但實際上其this並不是指向window,由於該函數執行時的做用域是當前做用域,即等同於在該行將裏面的代碼填進去。下面的例子說明了這個問題:this
var name = "window"; var Bob = { name: "Bob", showName: function(){ eval("alert(this.name)"); } }; Bob.showName();
其實除去上面的特殊狀況,咱們只要記住這四種狀況,那麼對於this的指向應該就有一個較爲清楚的認識。
博文中若有敘述不清或者錯誤,歡迎各位批評指正!完結撒花~