昨天在作某廠的筆試題霎烙,答的一塌糊涂,感覺(jué)很熟悉赡茸,卻又說(shuō)不出正確答案谓着,還是因?yàn)槠綍r(shí)真正深刻理解的東西太少,關(guān)于js的作用域問(wèn)題是個(gè)永遠(yuǎn)都說(shuō)不完的話題坛掠,昨天就遇到了赊锚。題目大概如下:
var user = {
name: "jack",
getname: function(){
return this.name;
}
};
var obj = user.getname;
console.log(obj());
console.log(user.getname());
問(wèn)題是:輸出結(jié)果是什么?
a. jack, jack;
b. jack, undefined;
c. undefined, jack;
d. undefined, undefined;
e. '', '';
f. '', jack;
相信大多數(shù)人在看js的作用域和作用域鏈這部分的時(shí)候都見(jiàn)過(guò)這個(gè)題屉栓,所以我就不假思索的選了d. undefined, undefined
,事后自己敲了代碼才知道大錯(cuò)特錯(cuò)舷蒲。正確答案為:'', jack
。我怎么都想不到的~~
所以今天就認(rèn)真的分析了一下友多,為什么會(huì)是這個(gè)結(jié)果呢牲平?
(1)輸出''
的原因:
首先在對(duì)象user聲明結(jié)束后,定義了obj變量域滥,并初始化纵柿,var obj = user.getname;
這個(gè)過(guò)程相當(dāng)于將getname()這個(gè)函數(shù)的指針賦給了obj變量,此時(shí)obj就相當(dāng)于:
var obj = function(){
return this.name;
};
此時(shí)this指向window對(duì)象启绰,然后window有個(gè)name屬性昂儒,然而window.name并沒(méi)有賦值,此時(shí)就為' '委可。
(2)輸出jack的原因:
這個(gè)比較好理解渊跋,因?yàn)閡ser對(duì)象直接調(diào)用自己的方法,此時(shí)的this自然就是user本身,user自身有name屬性拾酝,所以就輸出了jack燕少。
總結(jié):好多時(shí)候不是問(wèn)題太難,而是我們從來(lái)不往深了想蒿囤,得過(guò)且過(guò)就會(huì)屢屢在同一個(gè)地方摔跟頭客们,寫這篇就是想讓自己長(zhǎng)記性。