JS——this

this的指向在函數(shù)定義的時候是確定不了的的畴,只有函數(shù)執(zhí)行的時候才能確定this到底指向誰,實際上this的最終指向的是那個調(diào)用它的對象

function a(){
    var user = "ben";
    console.log(this.user); //undefined
    console.log(this); //Window
}
a();

var o = {
    user:"ben",
    fn:function(){
        console.log(this.user);  //ben
    }
}
o.fn();

this 的四種綁定規(guī)則
this的4種綁定規(guī)則分別是:默認綁定足淆、顯示綁定隱式綁定巢块、、new 綁定巧号。優(yōu)先級從低到高

默認綁定

什么叫默認綁定族奢,即沒有其他綁定規(guī)則存在時的默認規(guī)則。這也是函數(shù)調(diào)用中最常用的規(guī)則丹鸿。
來看這段代碼:

function foo() { 
}       console.log( this.a );
var a = 2; 
foo(); //打印的是什么越走?
foo() 打印的結(jié)果是2。

因為foo()是直接調(diào)用的(獨立函數(shù)調(diào)用),沒有應(yīng)用其他的綁定規(guī)則廊敌,這里進行了默認綁定铜跑,將全局對象綁定this上,所以this.a 就解析成了全局變量中的a骡澈,即2

隱式綁定

除了直接對函數(shù)進行調(diào)用外锅纺,有些情況是,函數(shù)的調(diào)用是在某個對象上觸發(fā)的肋殴,即調(diào)用位置上存在上下文對象囤锉。

function foo() { 
    console.log( this.a );
}
var a = 2;
var obj = { 
    a: 3,
    foo: foo 
};
obj.foo(); // ?
obj.foo() 打印的結(jié)果是3。

這里foo函數(shù)被當做引用屬性护锤,被添加到obj對象上官地。這里的調(diào)用過程是這樣的:
獲取obj.foo屬性 -> 根據(jù)引用關(guān)系找到foo函數(shù),執(zhí)行調(diào)用
所以這里對foo的調(diào)用存在上下文對象obj烙懦,this進行了隱式綁定驱入,即this綁定到了obj上,所以this.a被解析成了obj.a氯析,即3沧侥。

多層調(diào)用鏈

function foo() { 
    console.log( this.a );
}
var a = 2;
var obj1 = { 
    a: 4,
    foo: foo 
};
var obj2 = { 
    a: 3,
    obj1: obj1
};
obj2.obj1.foo(); //?
obj2.obj1.foo() 打印的結(jié)果是4。

同樣魄鸦,我們看下函數(shù)的調(diào)用過程:
先獲取obj1.obj2 -> 通過引用獲取到obj2對象,再訪問 obj2.foo -> 最后執(zhí)行foo函數(shù)調(diào)用
這里調(diào)用鏈不只一層癣朗,存在obj1拾因、obj2兩個對象,那么隱式綁定具體會綁哪個對象旷余。這里原則是獲取最后一層調(diào)用的上下文對象绢记,即obj2,所以結(jié)果顯然是4(obj2.a)正卧。

顯示綁定

相對隱式綁定蠢熄,this值在調(diào)用過程中會動態(tài)變化,可是我們就想綁定指定的對象炉旷,這時就用到了顯示綁定
可以通過這兩個方法call(…)或apply(…)來實現(xiàn)

function foo() { 
    console.log( this.a );
}
var a = 2;
var obj1 = { 
    a: 3,
};
var obj2 = { 
    a: 4,
};
foo.call( obj1 ); // 3
foo.call( obj2 ); // 4

new 綁定

在js中签孔,構(gòu)造函數(shù)與普通函數(shù)的區(qū)別不是很大。接下來就主要講講兩者的區(qū)別窘行。
1.在命名規(guī)則上饥追,構(gòu)造函數(shù)一般是首字母大寫,普通函數(shù)則是遵照小駝峰式命名法罐盔。
2.在函數(shù)調(diào)用時

//構(gòu)造函數(shù)
function Egperson (name,age) {
    this.name = name;
    this.age = age;
    this.sayName = function () {
        alert(this.name);
     }
}
var person = new Egperson('mike','18'); //this-->person
person.sayName();  //'mike'
//普通函數(shù)
function egPerson (name,age) {
    this.name = name;
    this.age = age;
    this.sayName = function () {
        alert(this.name);
     }
}
egPerson('alice','23'); //this-->window
window.sayName();  //'alice'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末但绕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捏顺,老刑警劉巖六孵,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異幅骄,居然都是意外死亡劫窒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門昌执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烛亦,“玉大人,你說我怎么就攤上這事懂拾∶呵荩” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵岖赋,是天一觀的道長檬果。 經(jīng)常有香客問我,道長唐断,這世上最難降的妖魔是什么选脊? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮脸甘,結(jié)果婚禮上恳啥,老公的妹妹穿的比我還像新娘。我一直安慰自己丹诀,他們只是感情好钝的,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铆遭,像睡著了一般硝桩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枚荣,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天碗脊,我揣著相機與錄音,去河邊找鬼橄妆。 笑死衙伶,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的害碾。 我是一名探鬼主播痕支,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛮原!你這毒婦竟也來了卧须?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎花嘶,沒想到半個月后笋籽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡椭员,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年车海,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘击。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡侍芝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埋同,到底是詐尸還是另有隱情州叠,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布凶赁,位于F島的核電站咧栗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虱肄。R本人自食惡果不足惜致板,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咏窿。 院中可真熱鬧斟或,春花似錦、人聲如沸集嵌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纸淮。三九已至,卻和暖如春亚享,著一層夾襖步出監(jiān)牢的瞬間咽块,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工欺税, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侈沪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓晚凿,卻偏偏與公主長得像亭罪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子歼秽,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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

  • 目錄 this 是什么 this 的四種綁定規(guī)則 綁定規(guī)則的優(yōu)先級 綁定例外 擴展:箭頭函數(shù) this 是什么 理...
    M1mmm閱讀 341評論 0 0
  • JavaScript(面向?qū)ο?原型理解+繼承+作用域鏈和閉包+this使用總結(jié)) 一应役、面向?qū)ο?1、什么是面向?qū)?..
    老頭子_d0ec閱讀 297評論 0 0
  • You Don't Know JS: this & Object Prototypes Chapter 2: th...
    大橙子CZ閱讀 483評論 0 1
  • 一、你不知道的JavaScript 1箩祥、作用域 作用域 LHS RHS RHS查詢與簡單地查找某個變量的值別無二...
    頂兒響叮當閱讀 345評論 0 0
  • 1院崇、調(diào)用位置 在理解this的綁定之前,首先理解調(diào)用位置,決定this的綁定 function a() { // ...
    winerss閱讀 298評論 0 0