在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ Js中this指向的問題

Js中this指向的問題

var b=25;
var a={
b:20,
func: function(){
return this.b;
}
}
console.log(( a. func)())//20
console.log(( a. func, a.func)())//25我覺得應(yīng)該都是25啊。。

回答
編輯回答
貓小柒

@kikong 已經(jīng)說的比較完整了,我來補(bǔ)充下:

抽象下代碼,這樣好分析

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 的指向問題;

1、在方法調(diào)用(如果某個(gè)對(duì)象的屬性是函數(shù),這個(gè)屬性就叫方法,調(diào)用這個(gè)屬性,就叫方法調(diào)用)中,執(zhí)行函數(shù)體的時(shí)候,作為屬性訪問主體的對(duì)象和數(shù)組便是其調(diào)用方法內(nèi) this 的指向。通俗的說,調(diào)用誰的方法 this 就指向誰;)

2、雖然加上括號(hào)之后,就好像只是在引用一個(gè)函數(shù),但 this 的值得到了維持,因?yàn)?a.func() 和 (a.func()) 的定義時(shí)相同的,按照 kikong 所說,就是 ()不對(duì)拿到的引用執(zhí)行解引用操作,也就不取出實(shí)際指向的函數(shù)對(duì)象,還在a對(duì)象的環(huán)境下,接下來就對(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è)明白了,上面的題目就解開了;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è)局部變量。

2017年5月19日 21:30
編輯回答
菊外人

一個(gè)很簡單的原則判斷this指向:誰調(diào)用的指向誰

console.log(( a. func)())

a調(diào)用的func所以this就是a,即this.b就是a.b,所以this.b等于20

console.log(( a. func, a.func)())
//轉(zhuǎn)換成下面這兩句
var c = a.func
console.log(c())

在瀏覽器里這個(gè)就相當(dāng)于window調(diào)用的c(),所以this指向window,即this.b就是window.b,由于var b = 25,b變成全局變量(window.b)所以this.b等于25

2017年1月2日 14:53
編輯回答
野橘

除了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
2017年10月6日 02:42
編輯回答
萌吟
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我覺得應(yīng)該都是25啊。。 B

這里涉及到2個(gè)運(yù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 語句

(a.func)();

的左邊括號(hào)就是個(gè)分組運(yùn)算符,a.func屬性訪問表達(dá)式返回一個(gè)reference,分組運(yùn)算符不對(duì)拿到的引用執(zhí)行解引用操作,也就不取出實(shí)際指向的函數(shù)對(duì)象,還在a對(duì)象的環(huán)境下,接下來就對(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 語句

(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本身

2017年1月2日 09:34