4 回答

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超22個(gè)贊
var b=25;
var a={
b:20,
func: function(){
return this.b;
}
}
console.log(( a. func)())//20 A
console.log(( a. func, a.func)())//25我覺(jué)得應(yīng)該都是25啊。。 B
這里涉及到2個(gè)運(yùn)算符的問(wèn)題,分組運(yùn)算符,逗號(hào)運(yùn)算符
分組運(yùn)算符對(duì)于其中的表達(dá)式運(yùn)算結(jié)果為reference類型的-引用類型的,不會(huì)執(zhí)行取值操作
逗號(hào)運(yùn)算符對(duì)其中的每一個(gè)表達(dá)式的都會(huì)執(zhí)行取值操作,并且返回最有一個(gè)表達(dá)式的值作為最終的計(jì)算結(jié)果
那么對(duì)于 A 語(yǔ)句
(a.func)();
的左邊括號(hào)就是個(gè)分組運(yùn)算符,a.func屬性訪問(wèn)表達(dá)式返回一個(gè)reference,分組運(yùn)算符不對(duì)拿到的引用執(zhí)行解引用操作,也就不取出實(shí)際指向的函數(shù)對(duì)象,還在a對(duì)象的環(huán)境下,接下來(lái)就對(duì)拿到的reference執(zhí)行調(diào)用,此時(shí)的this還是a對(duì)象。這個(gè)和
var p=a.func;
p();
不同的,賦值運(yùn)算符會(huì)對(duì)a.func求值。獲取函數(shù)對(duì)象,進(jìn)而賦值給p。p調(diào)用,this為為全局對(duì)象
對(duì)于 A 語(yǔ)句
(a.func, a.func)();
逗號(hào)運(yùn)算符,對(duì)a.func都會(huì)取出實(shí)際指向的函數(shù)對(duì)象,返回這個(gè)函數(shù)對(duì)象。右邊的括號(hào)為一個(gè)函數(shù)調(diào)用操作符,此時(shí)的this為全局對(duì)象。
代碼改成如下也是同樣的結(jié)果
(1, a.func)();
對(duì)于引用和解應(yīng)用,另一個(gè)操作符delete會(huì)給出更好的理解
delete a.func;
delete操作符下,a.func的運(yùn)算結(jié)果是返回一個(gè)reference而不是函數(shù)對(duì)象。也就是delete的不是指向的函數(shù)對(duì)象而是a.func本身

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
除了this指向還有一個(gè)逗號(hào)操作符的小知識(shí)
逗號(hào)操作符依次執(zhí)行返回最后一個(gè) 相當(dāng)于賦給匿名值后再操作
(a.func)(); //-> a.func() a調(diào)用this為a
//逗號(hào)操作符相當(dāng)于賦給匿名值后再操作
(a.func, a.func)(); //-> var c = a.func; c(); c()->window.c() window調(diào)用this為window

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
抽象下代碼,這樣好分析
var a = {
func: function() {
console.log(this);
}
};
a.func();//1、a
(a.func)(); //2、 a
(a.func, a.func)(); //3、 window;
(a.func = a.func)(); // 4、window;
這里其實(shí)就是 this 的指向問(wèn)題;
1、在方法調(diào)用(如果某個(gè)對(duì)象的屬性是函數(shù),這個(gè)屬性就叫方法,調(diào)用這個(gè)屬性,就叫方法調(diào)用)中,執(zhí)行函數(shù)體的時(shí)候,作為屬性訪問(wèn)主體的對(duì)象和數(shù)組便是其調(diào)用方法內(nèi) this 的指向。通俗的說(shuō),調(diào)用誰(shuí)的方法 this 就指向誰(shuí);)
2、雖然加上括號(hào)之后,就好像只是在引用一個(gè)函數(shù),但 this 的值得到了維持,因?yàn)?a.func() 和 (a.func()) 的定義時(shí)相同的,按照 kikong 所說(shuō),就是 ()不對(duì)拿到的引用執(zhí)行解引用操作,也就不取出實(shí)際指向的函數(shù)對(duì)象,還在a對(duì)象的環(huán)境下,接下來(lái)就對(duì)拿到的reference執(zhí)行調(diào)用,此時(shí)的this還是a對(duì)象。
3、4、其實(shí)一樣,逗號(hào)運(yùn)算符、賦值運(yùn)算符都返回一個(gè)值,也就是保存在內(nèi)存中的函數(shù)本身,所以 this 的值不能得到維持,這是因?yàn)?/p>
this 對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的:在全局函數(shù)中,this 等于window(瀏覽器非嚴(yán)格模式,嚴(yán)格模式是 undefined)
上面四個(gè)明白了,上面的題目就解開(kāi)了;this 更多了解 戳這
這里有個(gè)引申,按照上面的邏輯,所有返回值操作的,都有可能去改變上面代碼中的 this 值,都需要謹(jǐn)慎,譬如
var a = {
func: function() {
return this;
}
};
function f(fn) {
console.log(fn());
}
f(a.func);//window
因?yàn)楹瘮?shù)中的參數(shù)也是按照值傳遞的,在向參數(shù)傳遞引用類型的值時(shí),會(huì)把這個(gè)值在內(nèi)存中的地址復(fù)制給一個(gè)局部變量。
添加回答
舉報(bào)