我們很常會在function中看到使用this這個關鍵字。但它是甚麼,要怎麼用?聽說它的判斷方法很麻煩? 不急,我們先來看看生活中的this
生活中的this可以幫我們省去一直講重複的詞,讓句子比較簡潔。
程式裡的this,一樣幫我們省去一些詞,只不過這個詞,指向執行「程式碼」的「物件」。
生活中的「這個」「那個」常常搞到最後,有人都不知道在說哪個。
JS裡也不例外,一樣有「對牛談this」的情形。所以為了想正確設定執行程式碼的物件,我們需要來好好跟this討教討教
大部分情況下,this的值取決於呼叫function的方法。(此方法不是指,function或指隸屬於object底下的function:method,可以想成:語法的意思,不要誤會喔)
不同的呼叫方法,會讓this指向不同的呼叫function的物件。
ok,重點筆記。我們比剛剛又知道更多了一點:從指向「執行碼」的物件,變成指向「呼叫function」的物件。所以大概率this、function跟object是分不了家的~
→ this 指向 「呼叫函式(function)」的「物件(object)」
既然我們知道this會指向「呼叫function的物件」。那很明顯,當呼叫一個function時,我們要去綁定this和物件。我們的小任務就是要去觀察:在甚麼情況下,跟誰綁?(when,who)
JS文檔最前面有 'use strict'; :
在JS嚴格的監控下,沒人敢跟this綁,所以是undefined
沒有寫'use strict' 非嚴格模式:this 跟全域物件綁
還記得我們上一篇說全域物件是誰嗎?
.
.
.
沒錯,在瀏覽器是window物件,在node是global物件,所以這裡this是跟window物件綁
var str = 'Here is Global';
function logStr (){
var str = 'Here is Local';
console.log(this.str)
}
logStr();
猜猜是log出global還是local?反正我第一次是猜錯的
.
.
.
公布答案:Here is Global
解析:
跟我一樣錯的人往上看,when的第一個,方法名.(),這裡用的就是他。
既然如此,this就會跟全域物件window綁定。(可以直接在主控台打this看看,真的會看到window喔,沒有跟你唬,你說虎不虎)
接著this.str,意味著window.str,在全域找str這個變數,再之後就log出global來啦~ok下一關
先打個岔,剛剛稚鳥一下講函式,一下講方法的,他們一樣嗎?感受到困惑惹?~~釐清一下囉
object(物件)
,物件裡面設(屬性名)屬性
function(函式)
令給(屬性名)屬性
,屬性值為function(函式)的屬性
,稱為該object
的method(方法)
程式碼長這樣
//object物件
var obj={};
//function函式 我們用宣告法
function fk(){
console.log('hi');
};
//等號左邊我們令一個屬性
//等號右邊我們把function函式,令給屬性
//此時該屬性稱為物件object的方法method
//沒要執行,就不要小括號();想要執行,小括號就加好加滿
obj.fkProperty = fk;
打岔結束
var str = 'Here is Global',
//obj1,obj2各自放不同的str
//obj1,obj2都把logStr function放入物件的log屬性中 (放進去才有辦法用隱含繫結調用壓)
obj1={str:'Here is Obj1' ,log:logStr},
obj2={str:'Here is Obj2' ,log:logStr , friend:obj1};
function logStr (){
var str = 'Here is Local';
console.log(this.str);
};
obj1.log(); //Here is Obj1
obj2.log(); //Here is Obj2
this.log(); //等價於 window.log() 全域沒有log這個function
//Uncaught TypeError: this.log is not a function
obj2.friend.log(); //Here is Obj1
解析:
JavaScript - This (1) - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
日常幹話:
今天就這樣愉快的結束了,明天還有三個方法呦