Baseline Widely available
this
ãã¼ã¯ã¼ãã¯ã颿°æ¬ä½ãªã©ã®ã³ã¼ããå®è¡ããã³ã³ããã¹ããæãã¾ããæãä¸è¬çãªç¨éã¯ãªãã¸ã§ã¯ãã¡ã½ããã§ããã®å ´åãthis
ã¯ã¡ã½ãããé¢é£ä»ãããã¦ãããªãã¸ã§ã¯ããæããããã«ãããåãã¡ã½ããããã¾ãã¾ãªãªãã¸ã§ã¯ãã§åå©ç¨ãããã¨ãã§ãã¾ãã
JavaScript ã§ this
ã®å¤ã¯ã颿°ãã©ã®ããã«å®ç¾©ããã¦ãããã§ã¯ãªããã©ã®ããã«å¼ã³åºãããã(å®è¡æã®ãã¤ã³ãæ¹æ³)ã«ãã£ã¦æ±ºã¾ãã¾ããé常ã®é¢æ°ããªãã¸ã§ã¯ãã®ã¡ã½ããã¨ãã¦å¼ã³åºãããå ´å (obj.method()
)ãthis
ã¯ãã®ãªãã¸ã§ã¯ããæãã¾ããåç¬ã®é¢æ°ã¨ãã¦å¼ã³åºãããå ´åï¼ãªãã¸ã§ã¯ãã«é¢é£ä»ãããã¦ããªã func()ï¼ãthis ã¯é常ãã°ãã¼ãã«ãªãã¸ã§ã¯ãï¼å³æ ¼ã¢ã¼ãã§ãªãå ´åï¼ãã°ãã¼ãã«ãªãã¸ã§ã¯ãã¾ã㯠undefined
ï¼å³æ ¼ã¢ã¼ãã®å ´åï¼ãæãã¾ãã Function.prototype.bind()
ã¡ã½ããã¯ãthis
ã®ãã¤ã³ãã夿´ãããªã颿°ã使ã§ãã¾ããã¾ããFunction.prototype.apply()
ããã³ Function.prototype.call()
ã¡ã½ããã¯ãç¹å®ã®å¼ã³åºãã«å¯¾ã㦠this
ã®å¤ãè¨å®ãããã¨ãã§ãã¾ãã
ã¢ãã¼é¢æ°ã§ã¯ãthis
ã®æ±ããç°ãªãã¾ããå®ç¾©ãããæç¹ã§è¦ªã¹ã³ã¼ãããç¶æ¿ãã¾ãããã®åä½ã«ãããã¢ãã¼é¢æ°ã¯ã³ã¼ã«ããã¯ãã³ã³ããã¹ãã®ä¿æãè¡ãä¸ã§ç¹ã«ä¾¿å©ã§ãããã ããã¢ãã¼é¢æ°ã«ã¯ç¬èªã® this
ãã¤ã³ãã£ã³ã°ãããã¾ããããã®ãããbind()
ãapply()
ãcall()
ã¡ã½ããã§ this
ã®å¤ãè¨å®ãããã¨ã¯ã§ãã¾ãããã¾ãããªãã¸ã§ã¯ãã¡ã½ããã§ç¾å¨ã®ãªãã¸ã§ã¯ããæããã¨ãã§ãã¾ããã
const test = {
prop: 42,
func: function () {
return this.prop;
},
};
console.log(test.func());
// Expected output: 42
æ§æ å¤
峿 ¼ã¢ã¼ãã§ãªãå ´åã¯ãthis
ã¯å¸¸ã«ãªãã¸ã§ã¯ããåç
§ãã¾ãã峿 ¼ã¢ã¼ãã§ã¯ãã©ã®ãããªå¤ãã©ã®ãããªå¤ã§ãåãå¾ã¾ããå¤ã®æ±ºå®æ¹æ³ã«é¢ãã詳細æ
å ±ã¯ãä¸è¨ãåç
§ãã¦ãã ããã
ãã®å¤ã¯ããããç¾ããã³ã³ããã¹ãï¼é¢æ°ãã¯ã©ã¹ãã°ãã¼ãã«ï¼ã«ãã£ã¦ç°ãªãã¾ãã
颿°ã³ã³ããã¹ã颿°å
ã§ã® this
ã®å¤ã¯ã颿°ã®å¼ã³åºãæ¹ã«ãã£ã¦ç°ãªãã¾ãã
ä¸è¨ã®ã³ã¼ã㯠strict ã¢ã¼ãã§ã¯ãªããããã¾ãå¼ã³åºãæã« this
ã®å¤ãè¨å®ãããªããããthis
ã¯æ¢å®ã§ã°ãã¼ãã«ãªãã¸ã§ã¯ãã¨ãªããããã¯ãã©ã¦ã¶ã¼ã§ã¯ window
ã§ãã
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
ã 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()
ã®ã¡ã½ããã使ç¨ãã¦ãæç¤ºçã«è¨å®ãããã¨ãã§ãã¾ããFunction.prototype.bind()
ã使ç¨ããã¨ã颿°ã®å¼ã³åºãæ¹æ³ã«é¢ããã夿´ãããªãç¹å®ã® this
å¤ãæã¤æ°ãã颿°ã使ãããã¨ãã§ãã¾ãããããã®ã¡ã½ããã使ç¨ããå ´åã颿°ã峿 ¼ã¢ã¼ãã§ãªãå ´åã§ããä¸è¨ã® this
ã®ç½®æã«ã¼ã«ãé©ç¨ããã¾ãã
颿°ãã³ã¼ã«ããã¯ã¨ãã¦æ¸¡ãããå ´åãthis
ã®å¤ã¯ã³ã¼ã«ããã¯ãã©ã®ããã«å¼ã³åºããããã«ãã£ã¦æ±ºã¾ããããã¯APIã®å®è£
è
ã«ãã£ã¦æ±ºå®ããã¾ããã³ã¼ã«ããã¯ã¯é常ãthis
ã®å¤ã undefined
ã§ï¼ãªãã¸ã§ã¯ãã«é¢é£ä»ããã«ç´æ¥ï¼å¼ã³åºããã¾ããããã¯ã颿°ã峿 ¼ã¢ã¼ãã§ãªãå ´åã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' }
æã«ã¯ãthis
å¤ã undefined
以å¤ã§ã³ã¼ã«ããã¯ãå¼ã³åºããããã¨ãããã¾ããä¾ãã°ãJSON.parse()
ã® reviver
弿°ã¨ JSON.stringify()
ã® replacer
弿°ã¯ã©ã¡ããããã®å¤ãè§£é/ã·ãªã¢ã©ã¤ãºã§ããããããã£ãå±ãããªãã¸ã§ã¯ãã«è¨å®ããã¦å¼ã³åºããã¾ãã
ã¢ãã¼é¢æ°ã§ã¯ãthis
å¤ã¯å¨å²ã®åå¥ã³ã³ããã¹ãã® this
ã®å¤ãä¿æãã¾ããè¨ãæããã°ãã¢ãã¼é¢æ°ã®æ¬ä½ãè©ä¾¡ããéãè¨èªã¯æ°ãã this
ã®ãã¤ã³ãã使ãã¾ããã
ä¾ãã°ãã°ãã¼ãã«ã³ã¼ãã§ã¯ãthis
ã¯å³æ ¼ã¢ã¼ãã§ãããã©ããã«ãããããã常㫠globalThis
ã¨ãªãã¾ããããã¯ãã°ãã¼ãã«ã³ã³ããã¹ãã®ãã¤ã³ãã«ãããã®ã§ãã
const globalObject = this;
const foo = () => this;
console.log(foo() === globalObject); // true
ã¢ãã¼é¢æ°ã¯ããã®é¢æ°ãåå¨ããã¹ã³ã¼ãã® 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
2 ã¤ç®ã®ä¾ (C2
) ã§ã¯ãæ§ç¯ä¸ã«ãªãã¸ã§ã¯ããè¿ããããããthis
ã«ãã¤ã³ãããã¦ããæ°ãããªãã¸ã§ã¯ãã¯ç ´æ£ããã¾ããï¼ããã¯æ¬è³ªçã«ãthis.a = 37;
ã®æããããã³ã¼ãã«ãã¾ãããã®ã³ã¼ãã¯å®è¡ããããããå³å¯ã«ã¯ãããã³ã¼ãã§ã¯ããã¾ããããå¤é¨ã«å½±é¿ãä¸ãããã¨ãªãåé¤ãããã¨ãã§ãã¾ããï¼
super.method()
å½¢å¼ã§é¢æ°ãæåã«å¼ã³åºãããå ´åãmethod
颿°å
ã® this
㯠super.method()
å¼ã³åºãã®å¨è¾ºã® this
å¤ã¨åãå¤ã§ãããé常 super
ãåç
§ãããªãã¸ã§ã¯ãã¨ã¯ç°ãªãã¾ããããã¯ãsuper.method
ãä¸è¨ã®ãªãã¸ã§ã¯ãã¡ã³ãã¼ã«ã¢ã¯ã»ã¹ãããããªãã®ã§ã¯ãªãããã§ããããã¯ãç°ãªããã¤ã³ãã«ã¼ã«ãæã¤ç¹å¥ãªæ§æã§ããä¾ãã°ãsuper
ã®ãªãã¡ã¬ã³ã¹ãåç
§ãã¦ãã ããã
ã¯ã©ã¹ã¯ãéçã³ã³ããã¹ãã¨ã¤ã³ã¹ã¿ã³ã¹ã³ã³ããã¹ãã® 2 ã¤ã«åãããã¨ãã§ãã¾ããã³ã³ã¹ãã©ã¯ã¿ã¼ãã¡ã½ãããã¤ã³ã¹ã¿ã³ã¹ãã£ã¼ã«ãåæååï¼ãããªãã¯ã¾ãã¯ãã©ã¤ãã¼ãï¼ã¯ã¤ã³ã¹ã¿ã³ã¹ã³ã³ããã¹ãã«å±ãã¾ããéçã¡ã½ãããéçãã£ã¼ã«ãåæååãéçåæåãããã¯ã¯éçã³ã³ããã¹ãã«å±ãã¾ããããããã®ã³ã³ããã¹ãã§ã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
ã¯ç¶æ¿ãããã¯ã©ã¹ã§ãã
è¦å: this
ã super()
ã®å¼ã³åºãã®åã«åç
§ããã¨ãã¨ã©ã¼ãçºçãã¾ãã
æ´¾çã¯ã©ã¹ã¯ã§ã¯ super()
ãå¼ã³åºãåã« return ããã¦ã¯ããã¾ããããã ãããªãã¸ã§ã¯ããè¿ãå ´åãã³ã³ã¹ãã©ã¯ã¿ã¼ããªãå ´åãé¤ãã¾ãã
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
ã«ããããã£ã追å ããã¨ã°ãã¼ãã«å¤æ°ã«ãªãã¾ã)ãããã¯ãã©ã¦ã¶ã¼ã¨ãã¼ãã®å ´åã§ãããããããã¹ãã¯ã°ãã¼ãã«ãªãã¸ã§ã¯ãã¨ã¯é¢ä¿ã®ãªãå¤ã globalThis
ã«æå®ãããã¨ãã§ãã¾ãã
// ã¦ã§ããã©ã¦ã¶ã¼ã§ã¯ window ãªãã¸ã§ã¯ããã°ãã¼ãã«ãªãã¸ã§ã¯ãã§ãã
console.log(this === window); // true
this.b = "MDN";
console.log(window.b); // "MDN"
console.log(b); // "MDN"
ã½ã¼ã¹ãã¢ã¸ã¥ã¼ã«ã¨ãã¦èªã¿è¾¼ã¾ããå ´åï¼HTML ã§ã¯ãtype="module"
ã <script>
ã¿ã°ã«è¿½å ããã¨ãããã¨ï¼ããã®å ´åã¯å¸¸ã«æä¸ä½ã§ 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" }); // Logs 3 "true"
ãªããã°ãã¼ãã«ã¹ã³ã¼ãã®ããã«è¦ãã¦ããå®è¡æã«ã¯å®éã«ã¯é¢æ°ã«ã©ããããã¦ããã½ã¼ã¹ã³ã¼ããããã¾ããä¾ãã°ãNode.js ã® CommonJS ã¢ã¸ã¥ã¼ã«ã¯é¢æ°ã«ã©ããããã¦ãããthis
å¤ã module.exports
ã«è¨å®ããã¦å®è¡ããã¾ããã¤ãã³ããã³ãã©ã¼å±æ§ã¯ããã®å¤ãé¢é£ä»ãããã¦ããè¦ç´ ã«è¨å®ããã¦å®è¡ããã¾ãã
ãªãã¸ã§ã¯ããªãã©ã«ã§ã¯ 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' 弿°ã«ãã¤ã³ãããã¾ãã
// 第 2 弿°ã¯é
åã§ããããã®ã¡ã³ãã¼ãååä»ã弿°ã«ãã¤ã³ãããã¾ãã
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
å¤ãã¯ãã¼ã¸ã£ã¨ãã¦ä½æãã¾ããæ¬¡ã®ä¾ã§ã¯ãthis
ã®å¤ãè¿ã颿°ãè¿ãã¡ã½ãã getThisGetter
ãæã¤ obj
ã使ãã¾ããè¿ããã颿°ã¯ã¢ãã¼é¢æ°ã¨ãã¦ä½æãããããããã® this
ã¯å¸¸ã«å
å«ãã颿°ã® this
ã«ãã¤ã³ãããã¾ããgetThisGetter
å
ã® this
ã®å¤ã¯ãå¼ã³åºãéã«è¨å®ãããã¨ãã§ãããã®çµæãè¿ããã颿°ã®è¿å¤ãè¨å®ããã¾ããgetThisGetter
ã¯å³æ ¼ã¢ã¼ãã§ã¯ãªã颿°ã§ããã¨ä»®å®ãã¾ããã¤ã¾ãã峿 ¼ã¢ã¼ãã§ãªãã¹ã¯ãªããã«å«ã¾ããã¯ã©ã¹ã峿 ¼ã¢ã¼ãã®é¢æ°ã«ããã«å
¥ãåã«ããã¦ããªãã¨ãããã¨ã§ãã
const obj = {
getThisGetter() {
const getter = () => this;
return getter;
},
};
getThisGetter
ã obj
ã®ã¡ã½ããã¨ãã¦å¼ã³åºããã¨ãã§ãã¾ããããã«ãããæ¬ä½å
é¨ã§ 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
ã«å¾ããã¨ã§ãfn2()
ã¯ãªãã¸ã§ã¯ãã«é¢é£ä»ãããããã¨ãªãå¼ã³åºããããããglobalThis
ã¨ãªãããã§ãã
const fn2 = obj.getThisGetter;
console.log(fn2()() === globalThis); // true in non-strict mode
ãã®åä½ã¯ãã³ã¼ã«ããã¯ãå®ç¾©ããéã«ã¨ã¦ã便å©ã§ããé常ãå颿°å¼ã¯èªåèªèº«ã§ this
ã®ãã¤ã³ãã使ããä¸ä½ã¹ã³ã¼ãã® this
å¤ãé ãã¦ãã¾ãã¾ããã¤ã¾ããthis
å¤ãæ°ã«ããªãã®ã§ããã°é¢æ°ãã¢ãã¼é¢æ°ã¨ãã¦å®ç¾©ãããã¨ãã§ããã¾ããå¿
è¦ã«å¿ãã¦ï¼ä¾ãã°ã¯ã©ã¹ã¡ã½ããå
ï¼ã§ this
ã®ãã¤ã³ãã使ãããã¨ãã§ãã¾ããsetTimeout()
ã使ç¨ããä¾ãåç
§ãã¦ãã ããã
this
ã²ãã¿ã¼ããã³ã»ãã¿ã¼ã«ããã this
ã¯ãããããã£ãå®ç¾©ããã¦ãããªãã¸ã§ã¯ãã§ã¯ãªããããããã£ã«ã¢ã¯ã»ã¹ãããªãã¸ã§ã¯ãã«åºã¥ãã¾ããã²ãã¿ã¼ã¾ãã¯ã»ãã¿ã¼ã¨ãã¦ä½¿ç¨ããã颿°ã¯ãããããã£ãè¨å®ã¾ãã¯åå¾ããããªãã¸ã§ã¯ãã« 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
ã¯ãªã¹ãã¼ãé
ç½®ããã¦ããè¦ç´ ã«è¨å®ããã¾ã (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>
ä¸è¨ã®ã¢ã©ã¼ã㯠button
ã¨è¡¨ç¤ºãã¾ãããã ããå¤å´ã®ã³ã¼ãããã®ããã«è¨å®ããã this
ãæã£ã¦ããã ãã ã¨ãããã¨ã«æ³¨æãã¦ãã ããã
<button onclick="alert((function () { return this; })());">
Show inner this
</button>
ãã®å ´åãå
é¨é¢æ°ã® this
弿°ã¯ globalThis
ã«ãã¤ã³ãããã¾ãï¼ããªãã¡ã峿 ¼ã¢ã¼ãã§ã¯ãªãå ´åã« this
ãå¼ã³åºãããéã«æ¸¡ãããªãæ¢å®ãªãã¸ã§ã¯ãï¼ã
é常ã®é¢æ°ã¨åæ§ã«ãã¡ã½ããå
ã® this
ã®å¤ã¯ãã©ã®ããã«å¼ã³åºããããã«ãã£ã¦ç°ãªãã¾ããã¯ã©ã¹å
ã® this
ã常ã«ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ãåç
§ããããã«ããã®åä½ããªã¼ãã¼ã©ã¤ããã¦ããã¨ä¾¿å©ãªå ´åãããã¾ãããããå®ç¾ããã«ã¯ãã³ã³ã¹ãã©ã¯ã¿ã¼ã§ã¯ã©ã¹ã®ã¡ã½ããããã¤ã³ããã¾ãã
class Car {
constructor() {
// éãã示ãããã« sayHi ã§ã¯ãªã sayBye ããã¤ã³ããã
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
ã§ã¡ã½ãããå¼ã³åºãã¨ã¨ã©ã¼ãçºçãã¾ãã
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()
ã®å®è£
ãæ¨¡å£ãããã¨ãã§ãã¾ããããããã£ãã²ãã¿ã¼ã¨ãã¦å®ç¾©ããã¢ã¯ã»ã¹ãããéã«ãã¤ã³ãæ¸ã¿é¢æ°ãè¿ãããããä¿åãã¾ããããã«ããã颿°ã¯ä¸åº¦ã ã使ãããå¿
è¦ãªå ´åã«ã®ã¿ä½æããã¾ãã
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