Baseline Widely available
ä¸å
¶ä»è¯è¨ç¸æ¯ï¼å½æ°ç this
å
³é®åå¨ JavaScript ä¸ç表ç°ç¥æä¸åï¼æ¤å¤ï¼å¨ä¸¥æ ¼æ¨¡å¼åéä¸¥æ ¼æ¨¡å¼ä¹é´ä¹ä¼æä¸äºå·®å«ã
å¨ç»å¤§å¤æ°æ
åµä¸ï¼å½æ°çè°ç¨æ¹å¼å³å®äº this
çå¼ï¼è¿è¡æ¶ç»å®ï¼ãthis
ä¸è½å¨æ§è¡æé´è¢«èµå¼ï¼å¹¶ä¸å¨æ¯æ¬¡å½æ°è¢«è°ç¨æ¶ this
çå¼ä¹å¯è½ä¼ä¸åãES5 å¼å
¥äº bind æ¹æ³æ¥è®¾ç½®å½æ°ç this
å¼ï¼èä¸ç¨èè彿°å¦ä½è¢«è°ç¨çãES2015 å¼å
¥äºç®å¤´å½æ°ï¼ç®å¤´å½æ°ä¸æä¾èªèº«ç this ç»å®ï¼this
çå¼å°ä¿æä¸ºéåè¯æ³ä¸ä¸æçå¼ï¼ã
const test = {
prop: 42,
func: function () {
return this.prop;
},
};
console.log(test.func());
// Expected output: 42
è¯æ³ å¼
å¨éä¸¥æ ¼æ¨¡å¼ä¸ï¼this
æ»æ¯æåä¸ä¸ªå¯¹è±¡ï¼å¨ä¸¥æ ¼æ¨¡å¼ä¸å¯ä»¥æ¯ä»»æå¼ãæå
³å¦ä½ç¡®å®è¯¥å¼çæ´å¤ä¿¡æ¯ï¼è¯·åé
ä¸é¢çæè¿°ã
this
çå¼åå³äºå®åºç°çä¸ä¸æï¼å½æ°ãç±»æå
¨å±ã
å¨å½æ°å
é¨ï¼this
çå¼åå³äºå½æ°å¦ä½è¢«è°ç¨ãå¯ä»¥å° this
ç使¯å½æ°çä¸ä¸ªéèåæ°ï¼å°±å彿°å®ä¹ä¸å£°æç忰䏿 ·ï¼ï¼this
æ¯è¯è¨å¨å½æ°ä½è¢«æ§è¡æ¶ä¸ºä½ å建çç»å®ã
对äºå
¸åç彿°ï¼this
ç弿¯å½æ°è¢«è®¿é®çå¯¹è±¡ãæ¢å¥è¯è¯´ï¼å¦æå½æ°è°ç¨ç形弿¯ obj.f()
ï¼é£ä¹ this
å°±æå obj
ãä¾å¦ï¼
function getThis() {
return this;
}
const obj1 = { name: "obj1" };
const obj2 = { name: "obj2" };
obj1.getThis = getThis;
obj2.getThis = getThis;
console.log(obj1.getThis()); // { name: 'obj1', getThis: [Function: getThis] }
console.log(obj2.getThis()); // { name: 'obj2', getThis: [Function: getThis] }
注æï¼è½ç¶å½æ°æ¯ç¸åçï¼ä½æ¯æ ¹æ®å
¶è°ç¨çæ¹å¼ï¼this
ç弿¯ä¸åçãè¿ä¸å½æ°åæ°ç工使¹å¼ç±»ä¼¼ã
this
çå¼ä¸æ¯æ¥ææ¤å½æ°ä½ä¸ºèªå·±å±æ§ç对象ï¼èæ¯ç¨äºè°ç¨æ¤å½æ°ç对象ãä½ å¯ä»¥éè¿è°ç¨å¯¹è±¡å¨ååé¾ä¸çæ¹æ³æ¥è¯æè¿ä¸ç¹ã
const obj3 = {
__proto__: obj1,
name: "obj3",
};
console.log(obj3.getThis()); // { name: 'obj3' }
this
ç弿»æ¯æ ¹æ®è°ç¨å½æ°çæ¹å¼èæ¹åï¼å³ä½¿å½æ°æ¯å¨å建对象æ¶å®ä¹çï¼
const obj4 = {
name: "obj4",
getThis() {
return this;
},
};
const obj5 = { name: "obj5" };
obj5.getThis = obj4.getThis;
console.log(obj5.getThis()); // { name: 'obj5', getThis: [Function: getThis] }
å¦ææ¹æ³è¢«è®¿é®ç弿¯ä¸ä¸ªåå§å¼ï¼this
ä¹å°æ¯ä¸ä¸ªåå§å¼ââä½åªæå½å½æ°å¤äºä¸¥æ ¼æ¨¡å¼ä¸ä¼å¦æ¤ã
function getThisStrict() {
"use strict"; // è¿å
¥ä¸¥æ ¼æ¨¡å¼
return this;
}
// ä»
ç¨äºæ¼ç¤ºââä½ ä¸åºè¯¥æ¹åå
ç½®çåå对象
Number.prototype.getThisStrict = getThisStrict;
console.log(typeof (1).getThisStrict()); // "number"
妿彿°å¨æ²¡æè¢«ä»»ä½ä¸è¥¿è®¿é®çæ
åµä¸è¢«è°ç¨ï¼this
å°æ¯ undefined
ââä½åªæå¨å½æ°å¤äºä¸¥æ ¼æ¨¡å¼ä¸ä¼å¦æ¤ã
console.log(typeof getThisStrict()); // "undefined"
å¨éä¸¥æ ¼æ¨¡å¼ä¸ï¼ä¸ä¸ªç¹æ®çè¿ç¨ç§°ä¸º this
æ¿æ¢ç¡®ä¿ this
ç弿»æ¯ä¸ä¸ªå¯¹è±¡ãè¿æå³çï¼
this
被设置为 undefined
æ null
ï¼this
ä¼è¢«æ¿æ¢ä¸º globalThis
ãthis
被设置为ä¸ä¸ªåå§å¼ï¼this
ä¼è¢«æ¿æ¢ä¸ºåå§å¼çå
è£
对象ãfunction getThis() {
return this;
}
// ä»
ç¨äºæ¼ç¤ºââä½ ä¸åºè¯¥ä¿®æ¹å
ç½®çåå对象
Number.prototype.getThis = getThis;
console.log(typeof (1).getThis()); // "object"
console.log(getThis() === globalThis); // true
å¨å
¸åç彿°è°ç¨ä¸ï¼this
æ¯éè¿å½æ°çåç¼ï¼ç¹ä¹åçé¨åï¼éå¼ä¼ éçï¼å°±åä¸ä¸ªåæ°ãä½ ä¹å¯ä»¥ä½¿ç¨ Function.prototype.call()
ãFunction.prototype.apply()
æ Reflect.apply()
æ¹æ³æ¾å¼è®¾ç½® this
çå¼ãä½¿ç¨ Function.prototype.bind()
ï¼ä½ å¯ä»¥å建ä¸ä¸ªæ°ç彿°ï¼æ è®ºå½æ°å¦ä½è¢«è°ç¨ï¼å
¶ this
çå¼é½ä¸ä¼æ¹åãå½ä½¿ç¨è¿äºæ¹æ³æ¶ï¼å¦æå½æ°æ¯å¨éä¸¥æ ¼æ¨¡å¼ä¸ï¼ä¸è¿° this
æ¿æ¢è§åä»ç¶éç¨ã
å½ä¸ä¸ªå½æ°ä½ä¸ºåè°å½æ°ä¼ éæ¶ï¼this
çå¼åå³äºå¦ä½è°ç¨åè°ï¼è¿ç± API çå®ç°è
å³å®ãåè°å½æ°é常以 undefined
ä½ä¸º this
çå¼è¢«è°ç¨ï¼ç´æ¥è°ç¨ï¼èä¸éå å°ä»»ä½å¯¹è±¡ä¸ï¼ï¼è¿æå³ç妿彿°æ¯å¨éä¸¥æ ¼æ¨¡å¼ï¼this
çå¼ä¼æ¯å
¨å±å¯¹è±¡ï¼globalThis
ï¼ãè¿å¨è¿ä»£æ°ç»æ¹æ³ãPromise()
æé 彿°çä¾åä¸é½æ¯éç¨çã
function logThis() {
"use strict";
console.log(this);
}
[1, 2, 3].forEach(logThis); // undefinedãundefinedãundefined
ä¸äº API å
è®¸ä½ ä¸ºåè°å½æ°çè°ç¨è®¾ç½®ä¸ä¸ª this
å¼ãä¾å¦ï¼ææçè¿ä»£æ°ç»æ¹æ³åç¸å
³çæ¹æ³ï¼å¦Set.prototype.forEach()
ï¼é½æ¥åä¸ä¸ªå¯éç thisArg
åæ°ã
[1, 2, 3].forEach(logThis, { name: "obj" });
// { name: 'obj' }, { name: 'obj' }, { name: 'obj' }
å¶å°ï¼åè°å½æ°ä¼ä»¥ä¸ä¸ªé undefined
ç this
å¼è¢«è°ç¨ãä¾å¦ï¼JSON.parse()
ç reviver
åæ°å JSON.stringify()
ç replacer
åæ°é½ä¼æ this
设置为æ£å¨è¢«è§£æ/åºååç屿§æå±ç对象ã
å¨ç®å¤´å½æ°ä¸ï¼this
ä¿çäºéåè¯æ³ä¸ä¸æç this
å¼ãæ¢å¥è¯è¯´ï¼å½å¯¹ç®å¤´å½æ°æ±å¼æ¶ï¼è¯è¨ä¸ä¼å建ä¸ä¸ªæ°ç this
ç»å®ã
ä¾å¦ï¼å¨å
¨å±ä»£ç ä¸ï¼æ 论æ¯å¦å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼ç±äºå
¨å±ä¸ä¸æç»å®ï¼this
弿»æ¯ globalThis
ã
const globalObject = this;
const foo = () => this;
console.log(foo() === globalObject); // true
ç®å¤´å½æ°å¨å
¶å¨å´çä½ç¨åä¸å建ä¸ä¸ª this
å¼çéå
ï¼è¿æå³çç®å¤´å½æ°çè¡ä¸ºå°±åå®ä»¬æ¯âèªå¨ç»å®âçââæ è®ºå¦ä½è°ç¨ï¼this
é½ç»å®å°å½æ°å建æ¶çå¼ï¼å¨ä¸é¢çä¾åä¸ï¼æ¯å
¨å±å¯¹è±¡ï¼ãå¨å
¶ä»å½æ°å
é¨å建çç®å¤´å½æ°ä¹æ¯å¦æ¤ï¼å®ä»¬ç this
å¼ä¿æä¸ºéåè¯æ³ä¸ä¸æç this
ãåè§ä¸é¢çä¾åã
æ¤å¤ï¼å½ä½¿ç¨ call()
ãbind()
æ apply()
è°ç¨ç®å¤´å½æ°æ¶ï¼thisArg
åæ°ä¼è¢«å¿½ç¥ãä¸è¿ï¼ä½ ä»ç¶å¯ä»¥ä½¿ç¨è¿äºæ¹æ³ä¼ éå
¶ä»åæ°ã
const obj = { name: "obj" };
// å°è¯ä½¿ç¨ call 设置 this
console.log(foo.call(obj) === globalObject); // true
// å°è¯ä½¿ç¨ bind 设置 this
const boundFoo = foo.bind(obj);
console.log(boundFoo() === globalObject); // true
æé 彿°
å½ä¸ä¸ªå½æ°è¢«ç¨ä½æé 彿°ï¼ä½¿ç¨ new
å
³é®åï¼æ¶ï¼æ 论æé 彿°æ¯å¨åªä¸ªå¯¹è±¡ä¸è¢«è®¿é®çï¼å
¶ this
é½ä¼è¢«ç»å®å°æ£å¨æé çæ°å¯¹è±¡ä¸ãé¤éæé 彿°è¿åå¦ä¸ä¸ªéåå§å¼ï¼ä¸ç¶ this
çå¼ä¼æä¸º new
表达å¼çå¼ã
function C() {
this.a = 37;
}
let o = new C();
console.log(o.a); // 37
function C2() {
this.a = 37;
return { a: 38 };
}
o = new C2();
console.log(o.a); // 38
å¨ç¬¬äºä¸ªä¾åï¼C2
ï¼ä¸ï¼å ä¸ºå¨æé è¿ç¨ä¸è¿åäºä¸ä¸ªå¯¹è±¡ï¼this
被ç»å®çæ°å¯¹è±¡è¢«ä¸¢å¼ãï¼è¿åºæ¬ä¸ä½¿å¾è¯å¥ this.a = 37;
æä¸ºäºæ»ä»£ç ãå®å¹¶ä¸å®å
¨æ¯æ»ä»£ç ï¼å 为å®è¢«æ§è¡äºï¼ä½æ¯å®å¯ä»¥è¢«æ¶é¤èä¸äº§çä»»ä½å¤é¨ææãï¼
å½ä¸ä¸ªå½æ°ä»¥ super.method()
çå½¢å¼è¢«è°ç¨æ¶ï¼method
彿°å
ç this
ä¸ super.method()
è°ç¨å¨å´ç this
å¼ç¸åï¼é常ä¸çäº super
ææåç对象ãè¿æ¯å 为 super.method
䏿¯åä¸é¢ç对象æå访é®ââ宿¯ä¸ç§ç¹æ®çè¯æ³ï¼æä¸åçç»å®è§åãæå
³ç¤ºä¾ï¼è¯·åè§ super
åèã
ä¸ä¸ªç±»å¯ä»¥è¢«å为两个ä¸ä¸æï¼éæåå®ä¾ãæé 彿°ãæ¹æ³åå®ä¾å段åå§åå¨ï¼å
¬ææç§æï¼å±äºå®ä¾ä¸ä¸æãéææ¹æ³ãéæå段åå§åå¨åéæåå§ååå±äºéæä¸ä¸æãthis
å¼å¨æ¯ä¸ªä¸ä¸æä¸é½æ¯ä¸åçã
ç±»æé 彿°æ»æ¯éè¿ new
è°ç¨ï¼æä»¥å®ä»¬çè¡ä¸ºä¸æé 彿°ç¸åï¼this
弿¯æ£å¨åå»ºçæ°å®ä¾ãç±»æ¹æ³çè¡ä¸ºå对象åé¢éä¸çæ¹æ³ââthis
弿¯æ¹æ³è¢«è®¿é®ç对象ãå¦ææ¹æ³æ²¡æè½¬ç§»å°å¦ä¸ä¸ªå¯¹è±¡ï¼this
é常æ¯ç±»çä¸ä¸ªå®ä¾ã
éææ¹æ³ä¸æ¯ this
ç屿§ãå®ä»¬æ¯ç±»æ¬èº«ç屿§ãå æ¤ï¼å®ä»¬é常å¨ç±»ä¸è®¿é®ï¼this
æ¯ç±»ï¼æåç±»ï¼çå¼ãéæåå§åå乿¯å¨ this
设置为å½åç±»çæ
åµä¸è¿è¡æ±å¼çã
åæ®µåå§åå¨ä¹å¨ç±»çä¸ä¸æä¸æ§è¡ãå®ä¾å段æ¯å¨ this
被设置为æ£å¨æé çå®ä¾çæ
åµä¸è¢«åå§åçãéæå段æ¯å¨ this
被设置为å½åç±»çæ
åµä¸è¢«åå§åçãè¿å°±æ¯ä¸ºä»ä¹å段åå§åå¨ä¸çç®å¤´å½æ°å¯¹äºå®ä¾å段ç»å®å°å®ä¾ï¼å¯¹äºéæå段ç»å®å°ç±»ã
class C {
instanceField = this;
static staticField = this;
}
const c = new C();
console.log(c.instanceField === c); // true
console.log(C.staticField === C); // true
æ´¾çç±»æé 彿°
ä¸åºç±»æé 彿°ä¸åï¼æ´¾çæé 彿°æ²¡æåå§ç this
ç»å®ãè°ç¨ super()
卿é 彿°ä¸å建ä¸ä¸ª this
ç»å®ï¼åºæ¬ä¸åæ±å¼ä»¥ä¸ä»£ç çææç±»ä¼¼ï¼å
¶ä¸ Base
æ¯åºç±»ï¼
è¦åï¼ å¨è°ç¨ super()
ä¹åå¼ç¨ this
å°æåºé误ã
æ´¾çç±»å¨è°ç¨ super()
ä¹åä¸è½æè¿åï¼é¤éæé 彿°è¿åä¸ä¸ªå¯¹è±¡ï¼è¿æ · this
å¼å°±ä¼è¢«è¦çï¼æè
ç±»æ ¹æ¬æ²¡ææé 彿°ã
class Base {}
class Good extends Base {}
class AlsoGood extends Base {
constructor() {
return { a: 5 };
}
}
class Bad extends Base {
constructor() {}
}
new Good();
new AlsoGood();
new Bad(); // ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
å
¨å±ä¸ä¸æ
å¨å
¨å±æ§è¡ä¸ä¸æä¸ï¼å¨ä»»ä½å½æ°æç±»ä¹å¤ï¼å¯è½å¨å
¨å±èå´å
å®ä¹çåæç®å¤´å½æ°å
é¨ï¼ï¼this
å¼åå³äºèæ¬è¿è¡çæ§è¡ä¸ä¸æãååè°ä¸æ ·ï¼this
å¼ç±è¿è¡æ¶ç¯å¢ï¼è°ç¨è
ï¼ç¡®å®ã
å¨èæ¬çé¡¶å±ï¼æ 论æ¯å¦å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼this
伿åglobalThis
ãè¿é常ä¸å
¨å±å¯¹è±¡ç¸åââä¾å¦ï¼å¦ææºä»£ç æ¾å¨ HTML ç <script>
å
ç´ å
å¹¶ä½ä¸ºèæ¬æ§è¡ï¼this === window
ã
夿³¨ï¼ globalThis
é常ä¸å
¨å±å¯¹è±¡çæ¦å¿µç¸åï¼å³å globalThis
æ·»å 屿§ä¼ä½¿å®ä»¬æä¸ºå
¨å±åéï¼ââè¿å¯¹äºæµè§å¨å Node æ¯è¿æ ·çââä½ä¸»æºå¯ä»¥ä¸º globalThis
æä¾ä¸å
¨å±å¯¹è±¡æ å
³çä¸åå¼ã
// å¨ç½é¡µæµè§å¨ä¸ï¼window å¯¹è±¡ä¹æ¯å
¨å±å¯¹è±¡ï¼
console.log(this === window); // true
this.b = "MDN";
console.log(window.b); // "MDN"
console.log(b); // "MDN"
妿æºä»£ç ä½ä¸ºæ¨¡åå è½½ï¼å¯¹äº HTMLï¼è¿æå³çå¨ <script>
æ ç¾ä¸æ·»å type="module"
ï¼ï¼å¨é¡¶å±ï¼this
æ»æ¯ undefined
ã
妿æºä»£ç ä½¿ç¨ eval()
æ§è¡ï¼this
ä¸ç´æ¥è°ç¨ eval çéåä¸ä¸æç¸åï¼æè
ä¸é´æ¥è°ç¨ eval ç globalThis
ï¼å°±åå®å¨åç¬çå
¨å±èæ¬ä¸è¿è¡ä¸æ ·ï¼ç¸åã
function test() {
// ç´æ¥è°ç¨ eval
console.log(eval("this") === this);
// é´æ¥è°ç¨ evalï¼éä¸¥æ ¼æ¨¡å¼
console.log(eval?.("this") === globalThis);
// é´æ¥è°ç¨ evalï¼ä¸¥æ ¼æ¨¡å¼
console.log(eval?.("'use strict'; this") === globalThis);
}
test.call({ name: "obj" }); // è¾åº 3 个 "true"
请注æï¼æäºæºä»£ç è½ç¶çèµ·æ¥åå
¨å±ä½ç¨åï¼ä½å¨æ§è¡æ¶å®é
ä¸è¢«å
è£
å¨ä¸ä¸ªå½æ°ä¸ãä¾å¦ï¼Node.js CommonJS 模å被å
è£
å¨ä¸ä¸ªå½æ°ä¸ï¼å¹¶ä¸ this
å¼è®¾ç½®ä¸º module.exports
ãäºä»¶å¤çå¨å±æ§æ§è¡æ¶ï¼this
设置为å®ä»¬éå å°çå
ç´ ã
对象åé¢éä¸å建 this
ä½ç¨åââåªæå¨å¯¹è±¡å
å®ä¹ç彿°ï¼æ¹æ³ï¼æä¼è¿æ ·åãå¨å¯¹è±¡åé¢éä¸ä½¿ç¨ this
ä¼ä»å¨å´çä½ç¨åç»§æ¿å¼ã
const obj = {
a: this,
};
console.log(obj.a === window); // true
ç¤ºä¾ å½æ°ä¸ä¸æä¸ç this
this
åæ°çå¼åå³äºå½æ°å¦ä½è¢«è°ç¨ï¼è䏿¯å®å¦ä½è¢«å®ä¹ã
// 对象å¯ä»¥ä½ä¸ºç¬¬ä¸ä¸ªåæ°ä¼ éç» 'call' æ 'apply'ï¼
// å¹¶ä¸ 'this' å°è¢«ç»å®å°å®ã
const obj = { a: "Custom" };
// ä½¿ç¨ var 声æçåéæä¸º 'globalThis' ç屿§ã
var a = "Global";
function whatsThis() {
return this.a; // 'this' åå³äºå½æ°å¦ä½è¢«è°ç¨
}
whatsThis(); // 'Global'; å¨éä¸¥æ ¼æ¨¡å¼ä¸ï¼'this' åæ°é»è®¤ä¸º 'globalThis'
obj.whatsThis = whatsThis;
obj.whatsThis(); // 'Custom'; 'this' åæ°è¢«ç»å®å° obj
ä½¿ç¨ call()
å apply()
ï¼ä½ å¯ä»¥å¯¹ this
è¿è¡ä¼ å¼ï¼å°±å宿¯ä¸ä¸ªæ¾å¼åæ°ã
function add(c, d) {
return this.a + this.b + c + d;
}
const o = { a: 1, b: 3 };
// 第ä¸ä¸ªåæ°è¢«ç»å®å°éå¼ç 'this' åæ°ï¼
// å©ä½çåæ°è¢«ç»å®å°å½ååæ°ã
add.call(o, 5, 7); // 16
// 第ä¸ä¸ªåæ°è¢«ç»å®å°éå¼ç 'this' åæ°ï¼
// 第äºä¸ªåæ°æ¯ä¸ä¸ªæ°ç»ï¼å
¶æå被ç»å®å°å½ååæ°ã
add.apply(o, [10, 20]); // 34
this å对象转æ¢
å¨éä¸¥æ ¼æ¨¡å¼ä¸ï¼å¦æä¸ä¸ªå½æ°è¢«è°ç¨æ¶å
¶ this
å¼ä¸æ¯ä¸ä¸ªå¯¹è±¡ï¼é£ä¹ this
å¼ä¼è¢«æ¿æ¢ä¸ºä¸ä¸ªå¯¹è±¡ãnull
å undefined
ä¼åæ globalThis
ãå 7
æ 'foo'
è¿æ ·çåå§å¼ä¼ä½¿ç¨ç¸å
³çæé 彿°è½¬æ¢ä¸ºå¯¹è±¡ï¼æä»¥åå§æ°å¼ 7
ä¼è¢«è½¬æ¢ä¸ºä¸ä¸ª Number
å
è£
ç±»ï¼å符串 'foo'
ä¼è¢«è½¬æ¢ä¸ºä¸ä¸ª String
å
è£
ç±»ã
function bar() {
console.log(Object.prototype.toString.call(this));
}
bar.call(7); // [object Number]
bar.call("foo"); // [object String]
bar.call(undefined); // [object Window]
bind() æ¹æ³
è°ç¨ f.bind(someObject)
ä¼å建ä¸ä¸ªæ°å½æ°ï¼è¿ä¸ªæ°å½æ°å
·æä¸ f
ç¸åç彿°ä½åä½ç¨åï¼ä½ this
ç弿°¸ä¹
ç»å®å° bind
ç第ä¸ä¸ªåæ°ï¼æ è®ºå½æ°å¦ä½è¢«è°ç¨ã
function f() {
return this.a;
}
const g = f.bind({ a: "azerty" });
console.log(g()); // azerty
const h = g.bind({ a: "yoo" }); // bind åªè½çæä¸æ¬¡ï¼
console.log(h()); // azerty
const o = { a: 37, f, g, h };
console.log(o.a, o.f(), o.g(), o.h()); // 37 37 azerty azerty
ç®å¤´å½æ°ä¸ç this
ç®å¤´å½æ°å¨éåæ§è¡ä¸ä¸æä¸åå»ºäº this
å¼çéå
ãå¨ä¸é¢çä¾åä¸ï¼æä»¬å建äºä¸ä¸ªå¯¹è±¡ obj
ï¼å®æä¸ä¸ªæ¹æ³ getThisGetter
ï¼è¯¥æ¹æ³è¿åä¸ä¸ªå½æ°ï¼è¿ä¸ªå½æ°è¿å this
çå¼ãè¿åç彿°æ¯ä½ä¸ºç®å¤´å½æ°çå½¢å¼å建çï¼æä»¥å®ç this
æ°¸ä¹
å°ç»å®å°å
¶æ§è¡ä¸ä¸æä¸ç this
ãgetThisGetter
å
é¨ç this
å¼å¯ä»¥å¨è°ç¨ä¸è®¾ç½®ï¼è¿åè¿æ¥å设置äºè¿å彿°çè¿åå¼ãæä»¬å设 getThisGetter
æ¯ä¸ä¸ªéä¸¥æ ¼å½æ°ï¼è¿æå³çå®å
å«å¨ä¸ä¸ªéä¸¥æ ¼æ¨¡å¼çèæ¬ä¸ï¼å¹¶ä¸æ²¡æè¿ä¸æ¥åµå¥å¨ç±»æä¸¥æ ¼æ¨¡å¼ç彿°ä¸ã
const obj = {
getThisGetter() {
const getter = () => this;
return getter;
},
};
æä»¬å¯ä»¥ä½ä¸º obj
çæ¹æ³è°ç¨ getThisGetter
ï¼è¿å°å¨å
¶ä¸»ä½å
é¨å° this
ç»å®å° obj
ãè¿åç彿°è¢«èµå¼ç»ä¸ä¸ªåé fn
ãç°å¨ï¼å½è°ç¨ fn
æ¶ï¼è¿åç this
å¼ä»ç¶æ¯éè¿è°ç¨ getThisGetter
设置çå¼ï¼å³ obj
ã妿è¿åç彿°ä¸æ¯ç®å¤´å½æ°ï¼é£ä¹è¿æ ·çè°ç¨ä¼å¯¼è´ this
å¼ä¸º globalThis
ï¼å 为 getThisGetter
æ¯éä¸¥æ ¼æ¨¡å¼çã
const fn = obj.getThisGetter();
console.log(fn() === obj); // true
使¯ï¼å¦æä½ è§£ç» obj
çæ¹æ³èä¸è°ç¨å®ï¼éè¦å°å¿ï¼å 为 getThisGetter
ä»ç¶æ¯ä¸ä¸ªæ¹æ³ï¼å®æä¸ä¸ªå¯åç this
å¼ãå¨ä¸é¢çä¾åä¸ï¼è°ç¨ fn2()()
å°è¿å globalThis
ï¼å 为å®éµå¾ª fn2()
ç this
ï¼ç±äºå®æ²¡æéå å°ä»»ä½å¯¹è±¡ä¸è¿è¡è°ç¨ï¼æä»¥æ¯ globalThis
ã
const fn2 = obj.getThisGetter;
console.log(fn2()() === globalThis); // å¨éä¸¥æ ¼æ¨¡å¼ä¸ä¸º true
è¿ç§è¡ä¸ºå¨å®ä¹åè°æ¶é常æç¨ãéå¸¸ï¼æ¯ä¸ªå½æ°è¡¨è¾¾å¼é½å建èªå·±ç this
ç»å®ï¼è¿ä¼é®è½ä¸å±ä½ç¨åç this
å¼ãç°å¨ï¼å¦æä½ ä¸å
³å¿ this
å¼ï¼ä½ å¯ä»¥å°å½æ°å®ä¹ä¸ºç®å¤´å½æ°ï¼å¹¶ä¸åªå¨ä½ éè¦çå°æ¹å建 this
ç»å®ï¼ä¾å¦ï¼å¨ç±»æ¹æ³ä¸ï¼ãåè§ setTimeout()
ç示ä¾ã
å¨ getter å setter ä¸ï¼this
æ¯åºäºè®¿é®å±æ§ç对象ï¼è䏿¯å®ä¹å±æ§ç对象ãç¨ä½ getter æ setter ç彿°ä¼å°å
¶ this
ç»å®å°æ£å¨è®¾ç½®æè·å屿§ç对象ã
function sum() {
return this.a + this.b + this.c;
}
const o = {
a: 1,
b: 2,
c: 3,
get average() {
return (this.a + this.b + this.c) / 3;
},
};
Object.defineProperty(o, "sum", {
get: sum,
enumerable: true,
configurable: true,
});
console.log(o.average, o.sum); // 2 6
DOM äºä»¶å¤çå¨ä¸ç this
å½ä¸ä¸ªå½æ°è¢«ç¨ä½äºä»¶å¤ç卿¶ï¼å®ç this
åæ°ç»å®å°æ¾ç½®çå¬å¨ç DOM å
ç´ ä¸ï¼ä¸äºæµè§å¨å¯¹äºä½¿ç¨ addEventListener()
以å¤çæ¹æ³å¨ææ·»å ççå¬å¨å¹¶ä¸éµå¾ªè¿ä¸ªçº¦å®ï¼ã
// å½ä½ä¸ºçå¬å¨è°ç¨æ¶ï¼å°ç¸å
³å
ç´ å为èè²
function bluify(e) {
// æ»æ¯ä¸º true
console.log(this === e.currentTarget);
// å½ currentTarget å target æ¯åä¸ä¸ªå¯¹è±¡æ¶ä¸º true
console.log(this === e.target);
this.style.backgroundColor = "#A5D9F3";
}
// è·åææ¡£ä¸çæ¯ä¸ä¸ªå
ç´
const elements = document.getElementsByTagName("*");
// æ·»å bluify ä½ä¸ºç¹å»çå¬å¨ï¼æä»¥å½å
ç´ è¢«ç¹å»æ¶ï¼å®ä¼åè
for (const element of elements) {
element.addEventListener("click", bluify, false);
}
å
èäºä»¶å¤çå¨ä¸ç this
å½ä»£ç ä»å
èäºä»¶å¤çå¨å±æ§è°ç¨æ¶ï¼å®ç this
ç»å®å°æ¾ç½®çå¬å¨ç DOM å
ç´ ä¸ï¼
<button onclick="alert(this.tagName.toLowerCase());">Show this</button>
ä¸é¢ç alert 伿¾ç¤º button
ãæ³¨æåªæå¤å±ä»£ç ä¸ç this
æ¯è¿æ ·è®¾ç½®çï¼
<button onclick="alert((function(){return this})());">Show inner this</button>
å¨è¿ç§æ
åµä¸ï¼å
é¨å½æ°ç this
æå globalThis
对象ï¼å³éä¸¥æ ¼æ¨¡å¼ä¸ï¼è°ç¨ç彿°æªè®¾ç½® this
æ¶æåçé»è®¤å¯¹è±¡ï¼ã
åå
¶ä»æ®é彿°ä¸æ ·ï¼æ¹æ³ä¸ç this
å¼åå³äºå®ä»¬å¦ä½è¢«è°ç¨ãææ¶ï¼æ¹åè¿ä¸ªè¡ä¸ºï¼è®©ç±»ä¸ç this
弿»æ¯æåè¿ä¸ªç±»å®ä¾ä¼å¾æç¨ã为äºåå°è¿ä¸ç¹ï¼å¯å¨æé 彿°ä¸ç»å®ç±»æ¹æ³ï¼
class Car {
constructor() {
// ç»å® sayBye è䏿¯ sayHi æ¥å±ç¤ºå·®å¼
this.sayBye = this.sayBye.bind(this);
}
sayHi() {
console.log(`Hello from ${this.name}`);
}
sayBye() {
console.log(`Bye from ${this.name}`);
}
get name() {
return "Ferrari";
}
}
class Bird {
get name() {
return "Tweety";
}
}
const car = new Car();
const bird = new Bird();
// æ¹æ³ä¸ 'this' çå¼åå³äºå®ä»¬çè°ç¨è
car.sayHi(); // Hello from Ferrari
bird.sayHi = car.sayHi;
bird.sayHi(); // Hello from Tweety
// 对äºç»å®æ¹æ³ï¼'this' ä¸ä¾èµäºè°ç¨è
bird.sayBye = car.sayBye;
bird.sayBye(); // Bye from Ferrari
夿³¨ï¼ ç±»æ»æ¯å¨ä¸¥æ ¼æ¨¡å¼ä¸ã妿ä¸ä¸ªæ¹æ³è¯å¾è®¿é® this
ä¸ç屿§ï¼ä½¿ç¨æªå®ä¹ç this
å¼è°ç¨è¯¥æ¹æ³å°ä¼æåºé误ã
const carSayHi = car.sayHi;
carSayHi(); // TypeError because the 'sayHi' method tries to access 'this.name', but 'this' is undefined in strict mode.
ç¶èï¼è¯·æ³¨æï¼èªå¨ç»å®çæ¹æ³éåçé®é¢ä¸ä½¿ç¨ç®å¤´å½æ°ä½ä¸ºç±»å±æ§ç¸åï¼ç±»çæ¯ä¸ªå®ä¾é½ä¼æå
¶æ¹æ³çèªå·±ç坿¬ï¼è¿ä¼å¢å å
å使ç¨ãåªå¨ç»å¯¹å¿
è¦çå°æ¹ä½¿ç¨å®ãä½ ä¹å¯ä»¥æ¨¡ä»¿ Intl.NumberFormat.prototype.format()
çå®ç°ï¼å®ä¹å±æ§ä½ä¸ºä¸ä¸ª getterï¼å½è®¿é®æ¶è¿åä¸ä¸ªç»å®å½æ°å¹¶ä¿åå®ï¼è¿æ ·å½æ°åªåå»ºä¸æ¬¡ï¼å¹¶ä¸åªä¼å¨å¿
è¦æ¶å建ã
尽管 with
è¯å¥å·²è¢«å¼ç¨ï¼å¹¶ä¸å¨ä¸¥æ ¼æ¨¡å¼ä¸ä¸å¯ç¨ï¼ä½å®ä»¬ä»ç¶æ¯æ£å¸¸ this
ç»å®è§åçä¸ä¸ªä¾å¤ãå¦æå¨ with
è¯å¥ä¸è°ç¨äºä¸ä¸ªå½æ°ï¼å¹¶ä¸è¯¥å½æ°æ¯ä½ç¨å对象ç屿§ï¼é£ä¹ this
å¼ä¼ç»å®å°ä½ç¨å对象ï¼å°±å¥½ååå¨ obj1.
åç¼ä¸æ ·ã
const obj1 = {
foo() {
return this;
},
};
with (obj1) {
console.log(foo() === obj1); // true
}
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4