this,你到底是誰症副?

目前為止店雅,重名現(xiàn)象很嚴重啊。北京有個老王贞铣,上海也有個老王闹啦,雖然他們都叫老王,但卻是兩個不同的人辕坝,誰又知道哪個才是專門給鄰居送驚喜的老王呢窍奋。
今天不研究老王,只是說說 this 關(guān)鍵字酱畅,看看它到底是誰费变。

一、this 關(guān)鍵字

this 就是指代一個對象圣贸。
隨著 this 所在區(qū)域的不同(函數(shù)使用場景的不同),this 所指代的對象也就不同扛稽,那么 this 在該區(qū)域(場景)的值會發(fā)生變化吁峻。
this 是誰,取決于函數(shù)的調(diào)用方式在张,那么 this 指代的對象就是:調(diào)用函數(shù)的那個對象用含。

二、使用場景

1. 純粹的函數(shù)調(diào)用

不論函數(shù)是否嵌套帮匾,只要是在全局作用域下運行啄骇,this 全部指代 window 對象。

  • 全局作用域下:this 指代的就是 window 對象
    此時相當于在 window 對象上綁定了函數(shù) fn瘟斜,調(diào)用形式相當于 window.fn()
function fn() {
    console.log(this);
}
fn()
  • 內(nèi)部函數(shù)(函數(shù)嵌套產(chǎn)生):this 指代的仍是 window 對象缸夹。
function outerFn () {
    function fn(){
      console.log(this);
    }
  fn()
}
outerFn()
  • 定時器內(nèi):this 指代的是 window 對象
document.addEventListener('click', function(e){
   setTimeout(function(){
       console.log(this);
   }, 200);
});
2. DOM對象綁定事件
  • 此時 this 指代的是綁定事件的那個元素
document.addEventListener('click', function(e){
    console.log(this); 
});
3. 作為構(gòu)造函數(shù)調(diào)用
  • 構(gòu)造函數(shù)內(nèi)痪寻,this 指代的就是實例對象
function City(name){
    this.name = name;
}
City.prototype.say = function(){
    console.log(this.name);
}
var first = new City('北京');
first.say(); // 北京

構(gòu)造函數(shù),就是專門用來生成“對象”的函數(shù)虽惭。構(gòu)造函數(shù)作為模板橡类,配合 new 操作符生成一個新的實例對象。此時 this 指代的就是這個新的實例對象芽唇。

4. 作為對象方法調(diào)用
  • 函數(shù)在對象內(nèi)作為方法時顾画,this 指代的就是該對象
var city = {
    name: '北京',
    say: function(){
      console.log(this);
    }
}
city.say(); // Object {name: "北京"}

函數(shù)可以作為一個對象的屬性,此時該函數(shù)被稱為該對象的方法匆笤。

三研侣、this 的綁定

1. Function.prototype.call()

簡單來說,call 方法的作用就是炮捧,以指定的 this 值和參數(shù)值去調(diào)用某個函數(shù)庶诡。
call 方法接收參數(shù)為一個參數(shù)列表。第一個參數(shù)就是:希望指定的 this 的值寓盗。
如果該參數(shù)的值為 null 或 undefined灌砖,則表示不需要傳入任何參數(shù)。
語法:fn.call(thisValue, [param1, param2...])

var city= {
  name: '北京'
}
function say(){
  return this;
}
say.call(city); // Object {name: "北京"}

還可以這樣

var maxValue= Math.max.call(null, 6,3,9,2,1);
console.log(maxValue);  //  9 
2. Function.prototype.apply()

apply 方法與 call 方法類似傀蚌。
它倆的區(qū)別就是基显,接收的參數(shù)不同,apply 方法接收的參數(shù)為一個參數(shù)數(shù)組善炫。
語法:fn.apply(thisValue, [paramArray])

var city= ['北京', '上海', '天津']
function say(){
  return this;
}
say.apply(city); // ["北京", "上海", "天津"]

還可以這樣

var arr = [6,3,9,2,1];
var maxValue= Math.max.apply(null, arr);
var index = [].indexOf.apply(arr, [maxValue])
console.log(maxValue, index);  //  9 2
3. Function.prototype.bind()

bind 方法與 call 方法和 apply 方法也是類似的。
但 call 和 apply 帶有借用的意思箩艺,也就是也用某個函數(shù)或方法窜醉,處理自己的參數(shù)。
而 bind 方法艺谆,卻會創(chuàng)建一個新函數(shù)榨惰,以指定的 this 值和參數(shù)值,去調(diào)用這個新函數(shù)静汤。
同樣會將傳入的第一個參數(shù)作為指定的 this 值琅催。
語法:fn.bind(thisValue[, arg1[, arg2[, ...]]])

var obj1 = {
  name: '小明',
  fn: function(){
    console.log(this.name)
  }
}
var obj2 = {
  name: '大剛'
}
var say = obj1.fn.bind(obj2); // bind 綁定 this
say(); // 大剛
------
var print = obj1.fn; // 直接賦值給 print
print(); // window
------
var print = obj1.fn.bind(obj1); // 直接賦值給 print
print(); // 小明

來個小測驗

var city= {
    name: '北京',
    say: function(){
        console.log(this);
    }
}

以下情況 this 分別代表誰?

city.say(); // city
------
var fn = city.say;
fn(); // window
------
(city.say = city.say)(); // window
本文章著作權(quán)歸饑人谷和本人所有虫给,轉(zhuǎn)載須說明來源藤抡!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抹估,隨后出現(xiàn)的幾起案子缠黍,更是在濱河造成了極大的恐慌,老刑警劉巖药蜻,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓷式,死亡現(xiàn)場離奇詭異替饿,居然都是意外死亡,警方通過查閱死者的電腦和手機蒿往,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門盛垦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓤漏,你說我怎么就攤上這事腾夯。” “怎么了蔬充?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵蝶俱,是天一觀的道長。 經(jīng)常有香客問我饥漫,道長榨呆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任庸队,我火速辦了婚禮积蜻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘彻消。我一直安慰自己竿拆,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布宾尚。 她就那樣靜靜地躺著丙笋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪煌贴。 梳的紋絲不亂的頭發(fā)上御板,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音牛郑,去河邊找鬼怠肋。 笑死,一個胖子當著我的面吹牛淹朋,可吹牛的內(nèi)容都是我干的灶似。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼瑞你,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了希痴?” 一聲冷哼從身側(cè)響起者甲,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砌创,沒想到半個月后虏缸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲫懒,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年刽辙,在試婚紗的時候發(fā)現(xiàn)自己被綠了窥岩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡宰缤,死狀恐怖颂翼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慨灭,我是刑警寧澤朦乏,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站氧骤,受9級特大地震影響呻疹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筹陵,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一刽锤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朦佩,春花似錦并思、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颅筋,卻和暖如春宙暇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背议泵。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工占贫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人先口。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓型奥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碉京。 傳聞我的和親對象是個殘疾皇子厢汹,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

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

  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情谐宙,實現(xiàn)同樣的效果;這時候需要使用工廠模式烫葬。簡單...
    舟漁行舟閱讀 7,777評論 2 17
  • 單例模式 適用場景:可能會在場景中使用到對象,但只有一個實例,加載時并不主動創(chuàng)建搭综,需要時才創(chuàng)建 最常見的單例模式垢箕,...
    Obeing閱讀 2,076評論 1 10
  • 三、閉包和高階函數(shù) 3.1 閉包 3.1.1 變量的作用域 所謂變量的作用域兑巾,就是變量的有效范圍条获。通過作用域的劃分...
    梁同學(xué)de自言自語閱讀 1,457評論 0 6
  • 與其他語言相比,函數(shù)的this關(guān)鍵字在JavaScript中的表現(xiàn)略有不同蒋歌,此外帅掘,在嚴格模式和非嚴格模式之間也會有...
    codingC閱讀 575評論 0 0
  • 第一部分 準入訓(xùn)練 第1章 進入忍者世界 js開發(fā)人員通常使用js庫來實現(xiàn)通用和可重用的功能。這些庫需要簡單易用奋姿,...
    如201608閱讀 1,355評論 1 2