ã¢ãã¼é¢æ°ã«ã¤ãã¦æ¹ãã¦èãã¦ã¿ã¾ãããã
ã¢ãã¼é¢æ°ã¯å°ããªãã®ãæ¸ãããã®åãªã âç°¡ç¥åâ ã§ã¯ããã¾ãããå½¹ç«ã¤ç¹å¾´ãããã¤ãããã¾ãã
JavaScriptã¯ãå°ããªé¢æ°ãæ¸ãå¿ è¦ãããç¶æ³ã«æºã¡ã¦ãããããã¯ããããªå ´æã§å®è¡ããã¾ãã
ä¾ãã°:
arr.forEach(func)âfuncã¯forEachã«ãã£ã¦ããã¹ã¦ã®é åé ç®ã«å¯¾ãã¦å®è¡ããã¾ããsetTimeout(func)âfuncã¯çµã¿è¾¼ã¿ã®ã¹ã±ã¸ã¥ã¼ã©ã«ããå®è¡ããã¾ãã- â¦ãã£ã¨ããã¾ãã
颿°ã使ãã¦ã©ããã«æ¸¡ãã®ã¯ãJavaScriptã®çé«ã§ãã
ããã¦ããã®ãããªé¢æ°ã§ã¯ãç§ãã¡ã¯é常ç¾å¨ã®ã³ã³ããã¹ãããé¢ãããããã¾ãããã¢ãã¼é¢æ°ã¯ãã®ãããªã¨ã便å©ã§ãã
ã¢ãã¼é¢æ°ã¯ âthisâ ãæã£ã¦ãã¾ãã
ãã£ãã¿ã¼ ãªãã¸ã§ã¯ãã¡ã½ãã, "this" ã§è¦ãã¦ããããã«ãã¢ãã¼é¢æ°ã¯ this ãæã£ã¦ãã¾ããããã this ãã¢ã¯ã»ã¹ãããå ´åãããã¯å¤å´ããåããã¾ãã
ä¾ãã°ãããã使ã£ã¦ãªãã¸ã§ã¯ãã¡ã½ããã®å å´ãå復ãããã¨ãã§ãã¾ãã:
let group = {
title: "Our Group",
students: ["John", "Pete", "Alice"],
showList() {
this.students.forEach(
student => alert(this.title + ': ' + student)
);
}
};
group.showList();
forEach ã§ã¯ãã¢ãã¼é¢æ°ã使ããã¦ããã®ã§ããã®ä¸ã® this.title ã¯å¤é¨ã¡ã½ãã showList ã¨å
¨ãåãã§ããã¤ã¾ã: group.title ã§ãã
ãã âé常ã®â 颿°ã使ã£ãå ´åã¯ã¨ã©ã¼ã«ãªãã¾ãã:
let group = {
title: "Our Group",
students: ["John", "Pete", "Alice"],
showList() {
this.students.forEach(function(student) {
// Error: Cannot read property 'title' of undefined
alert(this.title + ': ' + student)
});
}
};
group.showList();
forEach ã¯ãããã©ã«ãã§ã¯ this=undefined ã§é¢æ°ãå®è¡ããã®ã§ãundefined.title ã¸ã®ã¢ã¯ã»ã¹ã¸ã®è©¦ã¿ãè¡ããã¾ãããã®ããã¨ã©ã¼ãèµ·ããã¾ãã
ããã¯ã¢ãã¼é¢æ°ã«ã¯å½±é¿ãã¾ããããªããªããthis ãæã£ã¦ããªãããã§ãã
new ã§å®è¡ãããã¨ã¯ã§ãã¾ããthis ãæããªããã¨ã¯å½ç¶å¥ã®å¶éãæå³ãã¾ããã¢ãã¼é¢æ°ã¯ã³ã³ã¹ãã©ã¯ã¿ã¨ãã¦ä½¿ç¨ã§ãã¾ããã å½¼ã㯠new ã§å¼ã³åºããã¨ã¯ã§ãã¾ããã
ã¢ãã¼é¢æ° => 㨠.bind(this) ã§å¼ã°ããé常ã®é¢æ°ã®éã«ã¯å¾®å¦ãªéããããã¾ãã:
.bind(this)ã¯é¢æ°ã® âãã¤ã³ãããããã¼ã¸ã§ã³â ãä½ãã¾ãã- ã¢ãã¼
=>ã¯ãã¤ã³ãã£ã³ã°ã使ãã¾ããã颿°ã«ã¯åã«thisãããã¾ãããthisã®æ¤ç´¢ã¯é常ã®å¤æ°æ¤ç´¢ã¨ã¾ã£ããåãæ¹æ³ã§è¡ããã¾ã: å¤é¨ã®ã¬ãã·ã«ã«ç°å¢ã§ãã
ã¢ãã¼é¢æ°ã¯ âargumentsâ ãæã¡ã¾ãã
ã¢ãã¼é¢æ°ã¯ arguments 夿°ãæã£ã¦ãã¾ããã
ããã¯ãç¾å¨ã® this 㨠arguments ã使ã£ã¦å¼ã³åºãããã©ã¯ã¼ãããå¿
è¦ãããã¨ããªã©ããã³ã¬ã¼ã¿ã¨ãã¦ã¯ã¨ã¦ãç´ æ´ããããã®ã§ãã
ä¾ãã°ãdefer(f, ms) ã¯é¢æ°ãå¾ã¦ãms ããªç§ã§å¼ã³åºããé
ãããã©ããã¼ãè¿ãã¾ãã:
function defer(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms)
};
}
function sayHi(who) {
alert('Hello, ' + who);
}
let sayHiDeferred = defer(sayHi, 2000);
sayHiDeferred("John"); // Hello, John 2ç§å¾ã«
ã¢ãã¼é¢æ°ã使ããªãå ´åã¯æ¬¡ã®ããã«ãªãã¾ã:
function defer(f, ms) {
return function(...args) {
let ctx = this;
setTimeout(function() {
return f.apply(ctx, args);
}, ms);
};
}
ããã§ã¯ãç§ãã¡ã¯ setTimeout å
ã®é¢æ°ããããåãåãããã«ãä½åãªå¤æ° args 㨠ctx ãä½ããªããã°ãªãã¾ããã§ããã
ãµããª
ã¢ãã¼é¢æ°:
thisãæã¡ã¾ãããargumentsãæã¡ã¾ãããnewã§å¼ã³åºããã¨ã¯ã§ãã¾ããã- (
superãæã£ã¦ãã¾ãããããç§ãã¡ã¯ã¾ã ãããå¦ãã§ãã¾ããã§ããããã£ãã¿ã¼ ã¯ã©ã¹ã®ç¶æ¿ ã§å¦ç¿ãã¾ããã)ã
ããã¯ãç¬èªã® âã³ã³ããã¹ãâ ãæããããããç¾å¨ã®ã³ã³ããã¹ãã§åä½ããã³ã¼ãã®å°ããé¨åãæå³ããããã§ããããã¦ããã®ãããªã¦ã¼ã¹ã±ã¼ã¹ã§æ¬å½ã«è¼ãã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã