08 This - iruma-tea/dokushujs GitHub Wiki
JavaScriptã«ã¯ããªããžã§ã¯ããžã®åç §ãæ ŒçŽããthisãšããç¹æ®ãªããŒã¯ãŒããããã
å®è¡ã³ã³ããã¹ããšã¯ã³ãŒããå®è¡ãããéã«ãJavaScriptãšã³ãžã³ã«ãã£ãŠæºåãããã³ãŒãã®å®è¡ç°å¢ã®ããšã§ãã
JavaScriptã®ã³ãŒããå®è¡ãããåã«å¿
ãå®è¡ã³ã³ããã¹ããçæãããã©ã®ãããªç¶æ
ã§ã³ãŒããå®è¡ãããŠããã®ããšããæ
å ±ãå®è¡ã³ã³ããã¹ãæ¯ã«ä¿æããã
å®è¡ã³ã³ããã¹ããçæãããã¿ã€ãã³ã°ã¯äž»ã«2çš®é¡ããã
- HTMLã®scriptã¿ã°ã®çŽäžãJavaScriptãã¡ã€ã«ã®çŽäžã«èšè¿°ãããã³ãŒããå®è¡ãããçŽå â ã°ããŒãã«ã³ã³ããã¹ããšåŒã°ãã
- 颿°ãå®è¡ãããçŽå â 颿°ã³ã³ããã¹ããšåŒã°ãã
ã°ããŒãã«ã³ã³ããã¹ãã¯ããããã¬ãã«ã§ã³ãŒããå®è¡ããåã«çæãããå®è¡ã³ã³ããã¹ãã§ãã
HTMLã®scriptã¿ã°ã®çŽäžãJavaScriptãã¡ã€ã«ã®çŽäžã«èšè¿°ãããã³ãŒããå®è¡ãããåã«ããŸãã°ããŒãã«ã³ã³ããã¹ããçæãããã
ã°ããŒãã«ã³ã³ããã¹ãã§ã¯ãåã³ã³ããã¹ãå
ã§å®£èšãã倿°ã颿°ä»¥å€ã«ãWindowãªããžã§ã¯ã(window)ãšthisã䜿çšå¯èœã«ãªãã
âWindowãªããžã§ã¯ã
Windowãªããžã§ã¯ã(window)ã¯ããããŸã§äœ¿ã£ãŠããNumberãStringãconsoleãsetTimeoutãªã©ããã©ãŠã¶ããããããçšæãããŠãããªããžã§ã¯ããš
颿°(Web API)ãããããã£ã«æã€ç¹æ®ãªãªããžã§ã¯ã(ã°ããŒãã«ãªããžã§ã¯ã)ã§ãã
Windowãªããžã§ã¯ãã¯ãã³ãŒãã®ã©ããããåç
§ã§ãããŸããwindow.ã®éšåãçç¥ããŠèšè¿°ããããšãå¯èœã
âthis
thisããŒã¯ãŒãã¯å®è¡ã³ã³ããã¹ãã«ãã£ãŠåç
§å
ã®å€ãåãæ¿ãããã°ããŒãã«ã³ã³ããã¹ãã®thisã¯ã°ããŒãã«ãªããžã§ã¯ã(Windowãªããžã§ã¯ã)ãåç
§ããã
颿°ã³ã³ããã¹ãã¯ã颿°ãå®è¡ããããšãã«çæãããå®è¡ã³ã³ããã¹ãã§ãã
颿°ã³ã³ããã¹ãã§ã¯ãåã³ã³ããã¹ãå
ã§å®£èšãã倿°ã颿°ä»¥å€ã«ããã¬ãã·ã«ã«ã¹ã³ãŒãã®å€æ°ãthisããŒã¯ãŒããargumentãªããžã§ã¯ãã
superãšããç¹æ®ãªããŒã¯ãŒãã䜿çšã§ããã
superã¯ã¯ã©ã¹ã®ç¶æ¿ãç¹æ®ãªæ¡ä»¶äžã§ã®ã¿å©çšå¯èœãªããŒã¯ãŒãã§ãã
ã³ãŒã«ã¹ã¿ãã¯ãšã¯ãå®è¡ã³ã³ããã¹ãã®ç©ã¿éãã®ããšã§ãã
ã°ããŒãã«ã³ã³ããã¹ãã颿°ã³ã³ããã¹ãã¯ãåã³ã³ããã¹ãå
ã®ã³ãŒãã®å®è¡ããã¹ãŠå®äºããã¿ã€ãã³ã°ã§æ¶æ»
ããŸããã
åã³ã³ããã¹ãå
ã®ã³ãŒãã§ä»ã®é¢æ°ãåŒã³åºããããšåŒã³åºãå
ã®ã³ã³ããã¹ãã®äžã«ç©ã¿äžãããã圢ã§é¢æ°ã³ã³ããã¹ããæ°ãã«äœæãããã
ãããç¹°ãè¿ããããšãã«ã¯ãJavaScriptãšã³ãžã³äžã§ã©ãã©ã颿°ã³ã³ããã¹ããç©ã¿ããã£ãŠããç¶æ
ã«ãªããããã**ã³ãŒã«ã¹ã¿ãã¯(ãŸãã¯å®è¡ã³ã³ããã¹ãã¹ã¿ãã¯)ãšåŒã¶ã
颿°ã³ã³ããã¹ãå ã®thisã¯é¢æ°ã®å®è¡ã®ä»æ¹ã«ãã£ãŠãåç §ããå ãç°ãªãã倧ããåããŠæ¬¡ã®2çš®é¡ã«åé¡ã§ããã
thisã®åç §å ã¯ãã¡ãœãããå¯èœããããªããžã§ã¯ãã§ãããã¡ãœãããšããŠå®è¡ããããšã¯ãã€ãŸãããªããžã§ã¯ã.ã¡ãœãã()ãã®åœ¢åŒãå®è¡ããããšã§ããæ«å°Ÿã®äžžæ¬åŒ§()ãä»ããªãéããã¡ãœãããå®è¡ããŠããããšã«ã¯ãªããªãã®ã§æ³šæããŠãã ããã
**thisã®åç §å ã¯ãã°ããŒãã«ãªããžã§ã¯ã(ãã©ãŠã¶ã®å Žåã¯Windowãªããžã§ã¯ã)**ã§ãã
ãªããžã§ã¯ãã®ã¡ãœãããšããŠå®è¡ããã颿°å
ã®thisã®åç
§å
ã¯ãã¡ãœãããåŒã³åºãããå
ã«ãªã£ããªããžã§ã¯ã(ãããæŒç®åã®åã®ãªããžã§ã¯ã)ã§ãã
以éãåŒã³åºãå
ã®ãªããžã§ã¯ããšåŒã¶ã
次ã®ã³ãŒãã§ã¯ãã¡ãœããhelloãå®è¡ãããšãã®åŒã³åºãå
ãªããžã§ã¯ãã¯taroã§ãããããŠãã¡ãœããå
ã®thisã¯ããã®taroãåç
§ã
const taro = {
name: "倪é",
hello: function() {
console.log("ããã«ã¡ã¯ã" + this.name);
}
};
taro.hello();
> ããã«ã¡ã¯ã倪é
äžæ¹ããªããžã§ã¯ãã®ã¡ãœããã§ã¯ãªãããã ã®é¢æ°ãšããŠå®è¡ãããå Žåã®thisã®åç §å ã¯ãwindowãªããžã§ã¯ãã§ãã
window.name = "è±å";
function hello() {
console.log("ããã«ã¡ã¯ã" + this.name);
}
hello();
> ããã«ã¡ã¯ãè±å
ES5ã§è¿œå ãããStrictã¢ãŒããæå¹ã«ãããšé¢æ°ãšããŠå®è¡ãããšãã®thisã®å€ãWindowãªããžã§ã¯ãã§ã¯ãªãundefainedã«ãªãããæ³šæã
ã¢ããŒé¢æ°ã®ç¹åŸŽãšããŠãã¢ããŒé¢æ°ãå®è¡ããããšãã®é¢æ°ã³ã³ããã¹ãã«ã¯thisãååšããªãã
ãã®ãããã¢ããŒé¢æ°å
ã§thisããŒã¯ãŒãã䜿ãããå Žåã«ã¯ãã¹ã³ãŒããã§ãŒã³ããã©ã£ãŠãã¬ãã·ã«ã«ã¹ã³ãŒãã«å¯ŸããŠthisãæ¢ãã«è¡ãã
ãã®æãæåã«èŠã€ãã£ãthisãã¢ããŒé¢æ°ã®thisããŒã¯ãŒãã®åç
§å
ãšããŠäœ¿ãããã
const taro = {
name: "倪é",
hello: function() {
const jiro = {
name: "次é",
hello: () => {
console.log("ããã«ã¡ã¯ã" + this.name);
}
};
jiro.hello();
}
};
taro.hello();
> ããã«ã¡ã¯ã倪é
ãªããžã§ã¯ãã®ã¡ãœãããã³ãŒã«ããã¯é¢æ°ãšãããšã
window.name = "è±å";
const taro = {
name: "倪é",
hello: function() {
console.log("ããã«ã¡ã¯ã" + this.name);
}
};
function greeting(callback) {
callback();
}
greeting(taro.hello);
> ããã«ã¡ã¯ãè±å
taro.helloãåç
§ããŠããå
ã®é¢æ°ãcallbackãšããŠåŒæ°ã«ããããcallback()ãšãã圢åŒã§å®è¡ãããŠããã
ãã®ãšãã颿°ãããªããžã§ã¯ã.ã¡ãœãã()ãã®åœ¢åŒã§å®è¡ãããªããŠããªãããšã«æ³šæãcallback()ã¯ãããŸã§ãã
颿°ãšããŠå®è¡ããããããthisã®åç
§å
ã¯Windowãªããžã§ã¯ãã«ãªãã
ã©ããããªã«ããªããžã§ã¯ãã®ã¡ãœãããç·šéã«ä»£å
¥ããå Žåã«ããçºçããã
window name = "è±å";
const taro = {
name: "倪é",
hello: function() {
console.log("ããã«ã¡ã¯ã" + this.name);
}
};
const helloWho = taro.hello;
helloWho(); // 颿°ãšããŠå®è¡ãããã
> ããã«ã¡ã¯ãè±å
thisã®ç¹å®ã®å€ã«åºå®(æçž)ããã«ã¯ãbind,apply,callãšãã3ã€ã®ã¡ãœããã䜿ãã
bindã¡ãœããã䜿ããšãthisã®åç §å ã®å€ãèªç±ã«å€æŽã§ããŸããbindã䜿ã£ãŠthisã®åç §å ã倿Žããããšããbindã«ããthisã®æçžãšããã
[æ§æ] bindã®èšæ³
const newFn = fn.bind(obj[,param1, param2,....])
fn: thisããŸãã¯åŒæ°ãæçžããã颿°ãã¡ãœãããæå®ããã
obj: 颿°fnå
ã®thisã®åç
§å
ã«ããããªããžã§ã¯ããæå®ããã
param1,param2: bindã§ã¯é¢æ°fnã«æž¡ãåŒæ°ãæå®ã§ããã
newFn: bindã«ãã£ãŠãthisãŸãã¯åŒæ°ãæçžããããæ°ãã颿°ãæ ŒçŽãããã
function hello(greeting) {
console.log(greeting + this.name);
}
const taro = {
name: "倪é"
}
const helloTaro = hello.bind(taro, "ããã«ã¡ã¯ã");
helloTaro();
> ããã«ã¡ã¯ã倪é
bindã¡ãœãããäž»ã«äœ¿ãããã®ã¯ãã³ãŒã«ããã¯é¢æ°ãšããŠæž¡ã颿°ã®thisãåŒæ°ãæçžãããå Žåã§ãã
äŸãã°ããªããžã§ã¯ãã®ã¡ãœãããã³ãŒã«ããã¯é¢æ°ãšããŠæž¡ããå Žåã颿°ãšããŠå®è¡ãããŠããŸããããthisã®åç
§å
ãWindowãªããžã§ã¯ããšãªã£ãŠããŸãã
(äŸ1)
window.name = "è±å";
const taro = {
name: "倪é",
hello: function() {
console.log("ããã«ã¡ã¯ã" + this.name);
}
};
setTimeout(taro.hello.bind(taro), 2000); // ããã«ã¡ã¯ã倪éãšè¡šç€ºããã
setTimeout(taro.hello, 3000); // ããã«ã¡ã¯ãè±åãšè¡šç€ºãããã
(äŸ2)
window.name = "è±å";
const taro = {
name: "倪é",
hello: function() {
console.log("ããã«ã¡ã¯ã" + this.name);
}
};
// ç¡å颿°ã§taro.hello();ãå²ã
setTimeout(function() {
taro.hello();
}, 2000);
> ããã«ã¡ã¯ã倪é
bindã¡ãœããã¯ãæ°ãã颿°ãçæããã ãã§ããã®é¢æ°ã¯å®è¡ãããªããããããcallã¡ãœããã§ã¯ãthisãåŒæ°ãæçžããã
æ°ãã颿°ãçæãããã®é¢æ°ã峿ã«å®è¡ããã
[æ§æ] callã®èšæ³
fn.call(obj[,param1, param2,....]);
fn: thisããŸãã¯åŒæ°ãæçžããã颿°ãã¡ãœãããæå®ããã
obj: 颿°fnå
ã®thisã®åç
§å
ã«ããããªããžã§ã¯ããæå®ããŸãã
param1,param2: callã§ã¯é¢æ°fnã«æž¡ãåŒæ°ãæå®ã§ããã
callã¡ãœããã¯ãbindã¡ãœãããšåã圢åŒã§åŒæ°ãæž¡ããå¯äžãbindã¡ãœãããšç°ãªãã®ã¯ãcallã¡ãœãããåŒã³åºããæç¹ã§ãthisãåŒæ°ãæçžããã颿°ãå®è¡ãããç¹ã§ãã
const taro = { name: "倪é" };
function hello(greeting) {
console.log(`${greeting}ã${this.name}`);
}
hello.call(taro, "ããã«ã¡ã¯");
> ããã«ã¡ã¯ã倪é
window.name = "è±å";
const hello = () => {
console.log("ããã«ã¡ã¯ã" + this.name);
}
hello.call({name: "倪é"}); // ã¢ããŒé¢æ°ã§ã¯thisãæçžã§ããªãã
> ããã«ã¡ã¯ãè±å
applyã¡ãœããã¯ãcallã¡ãœãããšåãããthisãåŒæ°ãæçžããŠæ°ãã颿°ãäœæãã
ãã®é¢æ°ã峿ã«å®è¡ãããcallã¡ãœãããšç°ãªãã®ã¯ãapplyã¡ãœããã§ã¯ãåŒæ°ã®æçžã«é
åã䜿ããšããç¹ã§ãã
[æ§æ] applyã®èšæ³
fn.apply(obj, [, array]);
fn: thisããŸãã¯åŒæ°ãæçžããã颿°ãã¡ãœãããæå®ãã
obj: 颿°fnå
ã®thisã®åç
§å
ã«ããããªããžã§ã¯ããæå®ãã
array: applyã¡ãœããã®ç¬¬äºåŒæ°ã«ã¯é
åãæå®ãããé
åã«æ ŒçŽãããèŠçŽ ã颿°fnã®åŒæ°ãšããŠãããããæž¡ãããã
const taro = { name: "倪é" };
function hello(greeting, name) {
console.log(`${greeting}ã${name}`);
}
hello.apply(null, ["ããã«ã¡ã¯ã", "倪é"]);
> ããã«ã¡ã¯ã倪é