兩句話理解js中的this

this

前言: 一直都搞不清javascript中this的指向,<你不知道的javascript(上卷)>這本書中有3章都是在講解this,去年第一次看完還是覺得似懂非懂的,一深入的問還是不清楚,現(xiàn)在在看一遍,真心覺得這本書里將的是真好,想深入了解一下的,這本書是一個(gè)不錯(cuò)的選擇.

下面我就簡(jiǎn)單的說一下我的理解,用兩句話記住了javascrpt中this的指向:

this的指向

普通函數(shù)指向函數(shù)的調(diào)用者:有個(gè)簡(jiǎn)便的方法就是看函數(shù)前面有沒有點(diǎn),如果有點(diǎn),那么就指向點(diǎn)前面的那個(gè)值;
箭頭函數(shù)指向函數(shù)所在的所用域: 注意理解作用域,只有函數(shù)的{}構(gòu)成作用域,對(duì)象的{}以及 if(){}都不構(gòu)成作用域;
const obj = {
    name: 'objName',
    say() {
        console.log(this.name);
    },
    read: () => {
        console.log(this.name);
    }
}
obj.say(); // objName
obj.read(); // undefined
  • 普通函數(shù),調(diào)用者是obj,所以結(jié)果是 objname;也是理解say()是普通函數(shù),前面有點(diǎn),所以this指向obj;
  • 箭頭函數(shù),this指向函數(shù)所在的作用域,當(dāng)前的作用域?yàn)槿汁h(huán)境,所以this.nameundefined,
  • 舉下面的例子更清楚的了解一下箭頭函數(shù)this的指向,箭頭函數(shù)所在的作用域是普通函數(shù)say,say()的調(diào)用者是obj
const obj = {
    say: function () {
        setTimeout(() => {
            console.log(this)
        });
    }
}
obj.say(); // obj,此時(shí)this指的是定義他的obj

補(bǔ)充知識(shí)點(diǎn)

  • 瀏覽器默認(rèn)的this為window
function test() {
    console.log(this);
}
test(); //window
  • node.js中全局環(huán)境默認(rèn)this為{},普通函數(shù)中默認(rèn)this為global
console.log(this); // {}

function test() {
    console.log(this);
}
test(); //global

來兩道題檢查你是否掌握了

example1

const length = 10;
function fn() {
 console.log(this.length);
}

const  obj = {
    length: 5,
    method: function(fn) {
    fn();
    arguments[0]();
    }
};

obj.method(fn, 1);

輸出 10, 2

剛開始看到這道題我也是蒙蒙的,現(xiàn)在也終于理解了,
method這個(gè)函數(shù)傳入了兩個(gè)參數(shù),一個(gè)參數(shù)為fn(),fn()為普通函數(shù),this指向函數(shù)的調(diào)用者,此時(shí)指向全局(也可以看這個(gè)函數(shù)前面沒有點(diǎn)),所以運(yùn)行結(jié)果為10,arguments是函數(shù)的所有參數(shù),是一個(gè)類數(shù)組的對(duì)象,arguments0,可以看成是arguments.0(),調(diào)用這個(gè)函數(shù)的是arguments,此時(shí)this就是指arguments,this.length就是angument.length,就是傳入的參數(shù)的總個(gè)數(shù)2

注: 上面例子在node環(huán)境中的運(yùn)行結(jié)果為 undefined 2, const length = 10改成global.length = 10;是因?yàn)閚ode環(huán)境下定義在全局的變量不會(huì)綁定到global,瀏覽器也會(huì)自動(dòng)綁定到全局環(huán)境window

改成下面這樣結(jié)果又是什么呢?

const length = 10;

function fn() {
    console.log(this.length);
}

const obj = {
    length: 5,
    method: function(fn) {
        fn();
        const fun = arguments[0];
        fun()篇梭;
    }
};

obj.method(fn, 1);

10, 10

example 2

window.val = 1;
var obj = {
    val: 2,
    dbl: function() {
        this.val *= 2;
        val *= 2;
        console.log(val);
        console.log(this.val);
    }
}
obj.dbl(); // 2 4
var func = obj.dbl;
func(); // 8 8

這個(gè)就是有點(diǎn)繞了,不過一步步來分析就很容易理解了:

obj.dbl();執(zhí)行這行代碼時(shí)刺覆,this指的是obj,所以this.val === obj.val*=2,最后結(jié)果為4,val*=2 === window.val *= 2,最后結(jié)果是2

func()哎媚,執(zhí)行這行代碼時(shí),func()沒有任何前綴,this指的是window.func();所以此時(shí)this值得是windowthis.val === window.val *= 2,此時(shí)window.val4垛玻,val*=2 === window.val *2,最后結(jié)果為8,最后console.log(this.val),與console.log(val),指的都是window.val奶躯,最后結(jié)果都是8

上述是我自己的理解,如果有什么問題,歡迎指正~

About

github
blog

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帚桩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嘹黔,更是在濱河造成了極大的恐慌账嚎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儡蔓,死亡現(xiàn)場(chǎng)離奇詭異醉锄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浙值,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檩小,“玉大人开呐,你說我怎么就攤上這事。” “怎么了筐付?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵卵惦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我瓦戚,道長(zhǎng)沮尿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任较解,我火速辦了婚禮畜疾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘印衔。我一直安慰自己啡捶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布奸焙。 她就那樣靜靜地躺著瞎暑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪与帆。 梳的紋絲不亂的頭發(fā)上了赌,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音玄糟,去河邊找鬼勿她。 笑死,一個(gè)胖子當(dāng)著我的面吹牛茶凳,可吹牛的內(nèi)容都是我干的嫂拴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贮喧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼筒狠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起箱沦,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤辩恼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谓形,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灶伊,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年寒跳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了聘萨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡童太,死狀恐怖米辐,靈堂內(nèi)的尸體忽然破棺而出胸完,到底是詐尸還是另有隱情,我是刑警寧澤翘贮,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布赊窥,位于F島的核電站,受9級(jí)特大地震影響狸页,放射性物質(zhì)發(fā)生泄漏锨能。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一芍耘、第九天 我趴在偏房一處隱蔽的房頂上張望址遇。 院中可真熱鬧,春花似錦齿穗、人聲如沸傲隶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跺株。三九已至,卻和暖如春脖卖,著一層夾襖步出監(jiān)牢的瞬間乒省,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工畦木, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袖扛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓十籍,卻偏偏與公主長(zhǎng)得像蛆封,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勾栗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 1.在C/C++中實(shí)現(xiàn)本地方法 生成C/C++頭文件之后惨篱,你就需要寫頭文件對(duì)應(yīng)的本地方法。注意:所有的本地方法的第...
    JayQiu閱讀 2,361評(píng)論 0 3
  • 沒搞錯(cuò)吧围俘!js寫了那么多年砸讳,this還是會(huì)搞錯(cuò)!沒搞錯(cuò)界牡,javascript就是回搞錯(cuò)簿寂! ………… 在寫java的...
    zhoulujun閱讀 1,443評(píng)論 0 11
  • 1. this之謎 在JavaScript中,this是當(dāng)前執(zhí)行函數(shù)的上下文宿亡。因?yàn)镴avaScript有4種不同的...
    百里少龍閱讀 994評(píng)論 0 3
  • 前兩天加了Tom教練的一個(gè)“60秒訓(xùn)練營”挽荠,著重于練習(xí)口才烈钞。今天教練說要教給我們“銷售和市場(chǎng)營銷”的知識(shí)泊碑。...
    劍行者myfly2006閱讀 356評(píng)論 0 0
  • 今天一早就在心姐妹成長(zhǎng)營里跟大家分享昨日因著曉玲姐的作業(yè)點(diǎn)評(píng)而得來的收獲。沒想到帶出好幾個(gè)姐妹共同的受傷經(jīng)歷毯欣。總結(jié)...
    譚小哞Tanya閱讀 175評(píng)論 0 3