|
|
|
|
|
JavaScript面試時,this
是必考的題目,因此有必要熟練掌握this
這個知識點。在前面,我整理了6個關(guān)于this關(guān)鍵字的面試問題,本文中,再次通過5道練習(xí)題,學(xué)習(xí)this
的使用。
題目1:
請問,以下的getName
執(zhí)行結(jié)果為:
function getName() {
console.log(this.myName);
}
var myName = '全域';
// 主要程序代碼
var Ming = {
myName: '小明',
getName: getName
};
Ming.getName();
.
.
.
.
.
.
.
本題答案為2. '小明',請記住一個概念,傳統(tǒng)函數(shù)如何定義不會影響this
的指向,會影響指向的只有調(diào)用方式,在此是在 Ming
下調(diào)用 getName
的方法,因此this
會指向Ming
。
題目2:
請問,以下的getName
執(zhí)行結(jié)果為:
var Ming = {
myName: '小明',
getName: function() {
console.log(this.myName);
}
};
Ming.getName();
.
.
.
.
.
.
.
這題將 getName
函數(shù)直接定義在 Ming
的對象下,概念也與先前相同,不管如何定義,直接看是如何調(diào)用,所以本題結(jié)果依然是2. '小明'。
題目3:
請問,以下的getName
執(zhí)行結(jié)果為:
function getName() {
console.log(this.myName);
}
var myName = '全域';
// 主要程序代碼
var Ming = {
myName: '小明',
fn: function() {
getName();
}
};
Ming.fn();
.
.
.
.
.
.
.
這題在外層調(diào)用 fn()
方法,內(nèi)部再“直接調(diào)用getName
函數(shù)”,所以函數(shù)的 this
是直接由 getName();
這個調(diào)用方式而定(請注意,在此調(diào)用的前方?jīng)]有任何的對象),這種調(diào)用方式會稱為“simple call”(簡單調(diào)用),this
的指向為window
,結(jié)果會是1. '全域'。
題目4:
請問,以下的getName 執(zhí)行結(jié)果為:
function getName() {
console.log(this.myName);
}
var myName = '全域';
// 主要程序代碼
var Ming = {
myName: '小明',
family: {
myName: '小明家',
getName: getName
}
};
Ming.family.getName();
.
.
.
.
.
.
.
本題是 “對象的方法調(diào)用”,只要檢視 getName
調(diào)用時前方的對象是什么就可確認(rèn) this
的指向(family
對象),因此this
指向為family
結(jié)果為3. '小明家'。
題目5:
請問,以下的執(zhí)行結(jié)果為:
var myName = '全域';
// 主要程序代碼
var Ming = {
myName: '小明',
fn: function() {
setTimeout(function() {
console.log(this.myName);
}, 0);
}
};
Ming.fn();
.
.
.
.
.
.
.
本題的結(jié)果為:1.'全域'
這題算是許多新手會遇到的錯誤,在對象內(nèi)調(diào)用時如果出現(xiàn)立即函數(shù)、回調(diào)函數(shù)(callback function)結(jié)果會有什么變化?絕大多數(shù)的情況下這類型都會指向window
,所以不建議在此類型下直接調(diào)用this
。
總結(jié)
本文通過5道練習(xí)題,都是簡單的概念題,沒有復(fù)雜的邏輯及語法,希望通過本文的習(xí)題練習(xí),你能更好的掌握this
這個知識點。除了本文介紹的,你還可以看看關(guān)于this關(guān)鍵字的6個面試問題。
相關(guān)文章