Javascript中的this你都知道嗎

this是js中的一個關(guān)鍵字脯厨,其代指的對象是在程序運行時根據(jù)上下文環(huán)境確定的夺英。this的使用場景有下面幾種:

1.在全局命名空間中的this

在全局作用域下东亦,this指代的是全局對象window陆赋。

var a =1;
console.log(this.a)   // 1

2.函數(shù)中的this

在函數(shù)中使用this肥照,如果函數(shù)是作為對象的方法調(diào)用的,則this是指向調(diào)用這個方法的對象歹河,如果函數(shù)只是普通的調(diào)用掩浙,則里面的this指向的是window對象,構(gòu)造函數(shù)里的this則是指向這個新創(chuàng)建的對象秸歧。

  • 作為對象的方法調(diào)用函數(shù)
var a = 0;
var obj = {a : 1};
obj.getA = function(){
  console.log(this.a);
}
obj.getA(); // 1

函數(shù)里的this和函數(shù)的作用域是完全不同的概念厨姚,不能搞混

  • 作為普通函數(shù)調(diào)用
var  a = 0;
function getA (){
  console.log(this.a);
}
getA();   // 0
////////////////////
var obj = {a : 1};
obj.getA = function(){
  console.log(this.a);
  getOtherA();
  function getOtherA(){
    console.log(this.a);
  }
} 
obj.getA();     // 輸出1  0  

這里作為普通函數(shù)調(diào)用,不管這個函數(shù)定義在哪里键菱,只要不是作為對象的方法谬墙,或者作為構(gòu)造函數(shù),那么函數(shù)里面的this在調(diào)用時就是指向的window對象经备,如果在函數(shù)內(nèi)部定義的函數(shù)想使用外部的this拭抬,可以將this賦值給某個變量,像這樣:

obj.getA = function(){
  console.log(this.a);
  var that = this;
  getOtherA();
  function getOtherA(){
   console.log(that.a);   
 }
}
  • 作為構(gòu)造函數(shù)調(diào)用
function Obj (){
  this.a = 1;
}
var obj = new Obj();
console.log(this.a);   //1

作為構(gòu)造函數(shù)調(diào)用侵蒙,則this指向的是這個新創(chuàng)建的對象造虎,常用來做對象的初始化。

在對象中使用this

var a = 0; 
var obj ={
    a : 1 ,
    x : this.a, 
    foo : function(){
          console.log(this.x);
          var obj2 = {
                a : 2,
                b : this.a
            };
          console.log(obj2.b);
        }
}
obj.foo();
//輸出結(jié)果依次為 : 0  1

上面的結(jié)果估計很多人會有點懵逼纷闺。其實我們調(diào)入了一個陷阱算凿,認(rèn)為在對象中的this,就是代指的這個對象本身犁功,這是絕對錯誤的氓轰,根本就沒有這種說法。其實this只有兩個應(yīng)用場景浸卦,一是在全局作用域下用this署鸡,另一種就是在函數(shù)作用域下用this。在為對象屬性賦值時限嫌,對象使用到的變量在該對象所在的這個作用域中靴庆。

如上面的obj對象x屬性 ,其值是this.a 這里的this就是在全局作用域下的this萤皂,因為obj這個對象在全局作用域下撒穷。所以這里的this指代的是全局變量匣椰,所以x的值為0裆熙。
對于obj2,b=this.a 這里的this是在foo這里函數(shù)的作用域下,而foo是作為obj的屬性調(diào)用的入录,所以this指得是obj蛤奥,所以這里obj2.b = 1

理解這一點的關(guān)鍵就在于,對象是不會創(chuàng)建新的作用域的

通過call apply bind改變函數(shù)this的指向

function foo(arg1,arg2,arg3){};
//call指定this為obj僚稿,后面的參數(shù)作為foo的參數(shù)傳進(jìn)去
foo.call{obj,arg1,arg2...}  
 //apply也是指定this為obj凡桥,但是傳給foo的參數(shù)是以數(shù)組的形式
foo.apply{obj,[arg1,arg2]} 
// bind為foo綁定this,和兩個參數(shù) 蚀同。bind返回的是一個新函數(shù)
var newfoo = foo.bind(obj,arg1,arg2)  

調(diào)用bind返回的新函數(shù)缅刽,會調(diào)用foo,而且foo的this都是指向obj蠢络,而且傳入newfoo的參數(shù)都作為參數(shù)賦值給arg3及后面的參數(shù)衰猛,因為arg1,arg2已經(jīng)被綁定了。

//模擬bind , bind的一些特性還是模擬不來刹孔,功能可以模擬
Function.prototype.bind = Function.prototype.bind || function(obj...){
var self = this;
var boundArgs = arguments;
return function(){
var args=[],i;
for(i=1;i<boundArgs.length;i++) args.push(boundArgs[i]);
for(i=0;i<arguments.length;i++) args.push(arguments[i]);
return self.apply(obj,args);
}
};

ES6中的箭頭函數(shù)這里暫不討論

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啡省,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子髓霞,更是在濱河造成了極大的恐慌卦睹,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件方库,死亡現(xiàn)場離奇詭異结序,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)薪捍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門笼痹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酪穿,你說我怎么就攤上這事凳干。” “怎么了被济?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵救赐,是天一觀的道長。 經(jīng)常有香客問我只磷,道長经磅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任钮追,我火速辦了婚禮预厌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘元媚。我一直安慰自己轧叽,他們只是感情好苗沧,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炭晒,像睡著了一般待逞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上网严,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天识樱,我揣著相機(jī)與錄音,去河邊找鬼震束。 笑死怜庸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垢村。 我是一名探鬼主播休雌,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肝断!你這毒婦竟也來了杈曲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤胸懈,失蹤者是張志新(化名)和其女友劉穎担扑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趣钱,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡涌献,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了首有。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燕垃。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖井联,靈堂內(nèi)的尸體忽然破棺而出卜壕,到底是詐尸還是另有隱情,我是刑警寧澤烙常,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布轴捎,位于F島的核電站,受9級特大地震影響蚕脏,放射性物質(zhì)發(fā)生泄漏侦副。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一驼鞭、第九天 我趴在偏房一處隱蔽的房頂上張望秦驯。 院中可真熱鬧,春花似錦挣棕、人聲如沸译隘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽细燎。三九已至,卻和暖如春皂甘,著一層夾襖步出監(jiān)牢的瞬間玻驻,已是汗流浹背器予。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工锯梁, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麻裁。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓渐夸,卻偏偏與公主長得像嗤锉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子墓塌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容