javascript中的this
javascript中的this與java中的this有點(diǎn)不同懂拾。
ECMAScript規(guī)范中這樣寫:
- this 關(guān)鍵字執(zhí)行為當(dāng)前執(zhí)行環(huán)境的 ThisBinding亚兄。
MDN上這樣寫:
- 在絕大多數(shù)情況下,函數(shù)的調(diào)用方式?jīng)Q定了this的值。
可以這樣理解又跛,在JavaScript中眼五,this的指向是調(diào)用時(shí)決定的,而不是創(chuàng)建時(shí)決定的植康,這就會(huì)導(dǎo)致this的指向會(huì)讓人迷惑旷太,簡(jiǎn)單來說,this具有運(yùn)行期綁定的特性销睁。
一般情況下供璧,誰調(diào)用,this就指向誰
執(zhí)行上下文生命周期分為三階段冻记,創(chuàng)建睡毒、執(zhí)行、回收上下文冗栗。
- 執(zhí)行上下文的創(chuàng)建階段演顾,會(huì)分別生成變量對(duì)象,建立作用域鏈隅居,確定this指向
- 執(zhí)行上下文的執(zhí)行階段钠至,會(huì)分別變量賦值,函數(shù)引用胎源,執(zhí)行其他代碼
首先要明確一個(gè)非常重要的結(jié)論:this的指向是在函數(shù)被調(diào)用的時(shí)候確定的棉钧,也就是執(zhí)行上下文創(chuàng)建時(shí)
var a = 10;
var obj = {
a: 20
}
function fn() {
console.log(this.a);
}
fn(); // 10
fn.call(obj); // 20 call改變this指向到obj
全局this
有一個(gè)很好玩的情況:
var a = 10
function prin() {
var a = 30;
console.log(this.a)
}
prin() // 10 windows調(diào)用的函數(shù),所以this指向windows a = 10
console.log(a) // 10
var a = 10
function prin() {
a = 30;
console.log(this.a)
}
prin() // 30
console.log(a) // 30