æ¢ã«ãåç¥ã®éããJavaScriptã®é¢æ°ã¯å¤ã§ãã
JavaScriptã®ãã¹ã¦ã®å¤ã¯åãæã£ã¦ãã¾ãã颿°ã¯åã¯ä½ã§ããããï¼
JavaScriptã§ã¯ã颿°ã¯ãªãã¸ã§ã¯ãã§ãã
颿°ãã¤ã¡ã¼ã¸ããè¯ãæ¹æ³ã¯ãå¼ã³åºãå¯è½ãª âã¢ã¯ã·ã§ã³ãªãã¸ã§ã¯ãâ ã¨ã¿ãªããã¨ã§ããç§ãã¡ã¯ããããå¼ã³åºãã ãã§ãªãããªãã¸ã§ã¯ãã¨ãã¦æ±ããã¨ãã§ãã¾ã: ããããã£ã®è¿½å /åé¤ãåç §æ¸¡ããªã©ã
ânameâ ããããã£
颿°ãªãã¸ã§ã¯ãã«ã¯ãå¾ã ã«ãã¦ä½¿ç¨å¯è½ãªããããã£ãå°ãããããã¾ããã
ä¾ãã°ã颿°å㯠ânameâ ããããã£ã¨ãã¦ã¢ã¯ã»ã¹å¯è½ã§ã:
function sayHi() {
alert("Hi");
}
alert(sayHi.name); // sayHi
ãã£ã¨é¢ç½ããã¨ã«ãååãå²ãå½ã¦ããã¸ãã¯ã¯ã¹ãã¼ãã§ãã å²ãå½ã¦ã«ä½¿ç¨ããã颿°ã«ãæ£ããååãè²¼ãä»ãã¾ãã:
let sayHi = function() {
alert("Hi");
}
alert(sayHi.name); // sayHi (works!)
ããã©ã«ãå¤ãéãã¦è¡ãããä»£å ¥ã§ãåä½ãã¾ã:
function f(sayHi = function() {}) {
alert(sayHi.name); // sayHi (works!)
}
f();
仿§ã§ã¯ããã®æ©è½ã¯ âcontextual name(æèä¸ã®åå)â ã¨å¼ã°ãã¾ãã颿°ããããæä¾ããªãå ´åãä»£å ¥ã§ã¯ã³ã³ããã¹ãããè¦ã¤ãåºããã¾ãã
ãªãã¸ã§ã¯ãã¡ã½ãããååãæã£ã¦ãã¾ãã:
let user = {
sayHi() {
// ...
},
sayBye: function() {
// ...
}
}
alert(user.sayHi.name); // sayHi
alert(user.sayBye.name); // sayBye
ããããæ£ããååãææ¡ããæ¹æ³ããªãå ´åãããã¾ãããã®ãããªã¨ããname ããããã£ã¯æ¬¡ããã«ç©ºã«ãªãã¾ãã:
// é
åã®ä¸ã§ä½ããã颿°
let arr = [function() {}];
alert( arr[0].name ); // <empty string>
// ã¨ã³ã¸ã³ã«ã¯æ£ããååãè¨å®ããè¡ããªãã®ã§ååã¯ããã¾ãã
å®éã«ã¯ãã»ã¨ãã©ã®é¢æ°ã¯ååãæã£ã¦ãã¾ãã
âlengthâ ããããã£
颿°ãã©ã¡ã¼ã¿ã®æ°ãè¿ãå¥ã®çµã¿è¾¼ã¿ã®ãããã㣠âlengthâ ãããã¾ããä¾ãã°:
function f1(a) {}
function f2(a, b) {}
function many(a, b, ...more) {}
alert(f1.length); // 1
alert(f2.length); // 2
alert(many.length); // 2
ããã§ãæ®ãã®ãã©ã¡ã¼ã¿ã¯ã«ã¦ã³ããããªããã¨ãåããã¾ãã
length ããããã£ã¯ãä»ã®é¢æ°ä¸ã§åä½ãã颿°ã§å
çã®ããã«ä½¿ããããã¨ãããã¾ãã
ä¾ãã°ãä¸ã®ã³ã¼ãã§ã¯ãask 颿°ã¯è³ªåããããã® question ã¨ãå¼ã³åºãããã®ä»»æã®æ°ã® handler 颿°ãåãã¾ãã
ã¦ã¼ã¶ãçããã¨ããhandler ãå¼ã³ã¾ããç§ãã¡ã¯2ã¤ã®ç¨®é¡ã® handler ãæ¸¡ããã¨ãã§ãã¾ã:
- 弿°ãªã颿°ã®å ´åãè¯å®çãªåçã®å ´åã«ã®ã¿å¼ã°ãã¾ãã
- 弿°ãæã¤é¢æ°ã®å ´åã¯ããããã®ã±ã¼ã¹ã§ãå¼ã°ãããããçããå¾ã¾ãã
ãã®èãæ¹ã¯ãè¯å®çãªã±ã¼ã¹ï¼æãé »ç¹ã«å¤ãããã®ï¼ã®ããã®åç´ãªå¼æ°ãªãã®ãã³ãã©æ§æãããããæ±ç¨ã®ãã³ãã©ãæä¾ã§ããã¨ãããã¨ã§ãã
handlers ãæ£ããæ¹æ³ã§å¼ã¶ããã«ãç§ãã¡ã¯ length ããããã£ã調ã¹ã¾ã:
function ask(question, ...handlers) {
let isYes = confirm(question);
for(let handler of handlers) {
if (handler.length == 0) {
if (isYes) handler();
} else {
handler(isYes);
}
}
}
// è¯å®çãªè§£çã§ã¯ã両æ¹ã®ãã³ãã©ãå¼ã°ãã¾ã
// å¦å®çãªè§£çã§ã¯ã2ã¤ç®ã ããå¼ã°ãã¾ã
ask("Question?", () => alert('You said yes'), result => alert(result));
ããã¯ããããã ããªã¢ã¼ãã£ãºã (polymorphism) ã¨å¼ã°ããç¹å®ã®ã±ã¼ã¹ã§ã â 弿°ãåã«å¿ãã¦ãã¾ãã¯ç§ãã¡ã®å ´å㯠length ã«å¿ããæ±ãããã¾ãããã®ã¢ã¤ãã¢ã¯JavaScriptã©ã¤ãã©ãªã§ä½¿ç¨ããã¦ãã¾ãã
ã«ã¹ã¿ã ããããã£
æã ã¯ãç¬èªã®ããããã£ã追å ãããã¨ãã§ãã¾ãã
ããã§ã¯ãåè¨ã®å¼ã³åºãã«ã¦ã³ãã追跡ããããã® counter ããããã£ã追å ãã¾ã:
function sayHi() {
alert("Hi");
// ä½åº¦å®è¡ãããã«ã¦ã³ããã¾ããã
sayHi.counter++;
}
sayHi.counter = 0; // åæå¤
sayHi(); // Hi
sayHi(); // Hi
alert( `Called ${sayHi.counter} times` ); // 2度å¼ã°ãã¾ãã
sayHi.counter = 0 ã®ãããªé¢æ°ã«å²ãå½ã¦ãããããããã£ã¯ã颿°ã®ä¸ã§ãã¼ã«ã«å¤æ° counter ã¨ãã¦å®ç¾© ããã¾ãã ãè¨ãæããã¨ããããã㣠counter ã¨å¤æ° let counter ã¯2ã¤ã®ç¡é¢ä¿ãªãã®ã§ãã
ç§ãã¡ã¯ã颿°ããªãã¸ã§ã¯ãã¨ãã¦æ±ããã¨ãã§ãããã®ä¸ã«ããããã£ãæ ¼ç´ãããã¨ãåºæ¥ã¾ãããããããã¯ãã®å®è¡ã«ã¯å½±é¿ãä¸ãã¾ããã夿°ã¯é¢æ°ããããã£ã使ããã¨ã¯ãªããéãç¶ãã§ãããããã¯åãªã2ã¤ã®ä¸¦åããè¨èã§ãã
颿°ããããã£ã¯æã ã¯ãã¼ã¸ã£ãç½®ãæãããã¨ãã§ãã¾ããä¾ãã°ã颿°ããããã£ã使ãããã«ããã£ãã¿ã¼ 夿°ã¹ã³ã¼ããã¯ãã¼ã¸ã£ ã®ã«ã¦ã³ã¿ã¼ã®ä¾ãæ¸ãæãã¦ã¿ã¾ãã:
function makeCounter() {
// 次ã®ä»£ãã:
// let count = 0
function counter() {
return counter.count++;
};
counter.count = 0;
return counter;
}
let counter = makeCounter();
alert( counter() ); // 0
alert( counter() ); // 1
count ã¯ä»ãå¤é¨ã®ã¬ãã·ã«ã«ç°å¢ã§ã¯ãªãã颿°ã®ä¸ã«ç´æ¥æ ¼ç´ããã¦ãã¾ãã
ã¯ãã¼ã¸ã£ã使ããããæªãã®ã§ããããï¼ããã¨ãè¯ãã®ã§ããããï¼
主ãªéãã¯ãcount ã®å¤ãå¤é¨å¤æ°ã«ããå ´åãå¤é¨ã³ã¼ãã¯ããã¸ã¢ã¯ã»ã¹ãããã¨ã¯ã§ããªãã¨ãããã¨ã§ãããã¹ãããã颿°ã ããããã夿´ãããã¨ãã§ãã¾ãã:
function makeCounter() {
function counter() {
return counter.count++;
};
counter.count = 0;
return counter;
}
let counter = makeCounter();
counter.count = 10;
alert( counter() ); // 10
ãªã®ã§ãã©ã¡ããé¸ã¶ãã¯ç§ãã¡ã®ç®ç次第ã§ãã
ååä»ã颿°å¼(Named Function Expression)
ååä»ã颿°å¼ãã¾ãã¯ç¥ã㦠NFE ã¯ååãæã¤é¢æ°å¼ã®ç¨èªã§ãã
ä¾ãã°ãä¸è¬çãªé¢æ°å¼ãèãã¦ã¿ã¾ããã:
let sayHi = function(who) {
alert(`Hello, ${who}`);
};
â¦ããã¦ããã«ååã追å ãã¾ããã:
let sayHi = function func(who) {
alert(`Hello, ${who}`);
};
追å ã® "func" ã®ååã®å½¹å²ã¯ä½ã§ãããï¼
æåã«ãç§ãã¡ã¯ã¾ã 颿°å¼ãæã£ã¦ãããã¨ã«æ³¨æãã¦ãã ãããfunction ã®å¾ã«åå "func" ã追å ãã¦ãã颿°å®£è¨ã«ã¯ãªãã¾ããããªããªããããã¯ã¾ã 代å
¥å¼ã®ä¸é¨ã¨ãã¦ä½æããã¦ããããã§ãã
ãã®ãããªååã追å ãã¦ãä½ãç ´å£ãã¾ããã
颿°ã¯ä¾ç¶ã¨ã㦠sayHi() ã§å©ç¨å¯è½ã§ãã:
let sayHi = function func(who) {
alert(`Hello, ${who}`);
};
sayHi("John"); // Hello, John
ããã«ã¯ãåå func ã«é¢ãã¦2ã¤ã®ç¹å¥ãªãã¨ãããã¾ã:
- 颿°ã®å å´ãã颿°ãåç §ãããã¨ãã§ãã¾ãã
- 颿°ã®å¤å´ããã¯è¦ãã¾ããã
ä¾ãã°ãä¸ã®é¢æ° sayHi ã¯ãwho ãæä¾ããã¦ããªãå ´åã"Guest" ã§èªèº«ãå度å¼ã³ã¾ãã:
let sayHi = function func(who) {
if (who) {
alert(`Hello, ${who}`);
} else {
func("Guest"); // èªèº«ãå度å¼ã¶ããã« func ã使ç¨
}
};
sayHi(); // Hello, Guest
// ãããããã¯åä½ãã¾ãã:
func(); // Error, func ã¯æªå®ç¾©(颿°ã®å¤ããã¯è¦ãã¾ãã)
ãªã func ã使ãã®ã§ãããï¼åã« sayHi ã§ã¯ãã¡ãªã®ã§ããããï¼
å®éã«ã¯ãå¤ãã®ã±ã¼ã¹ã§ã¯æ¬¡ã®ããã«ã§ãã¾ã:
let sayHi = function(who) {
if (who) {
alert(`Hello, ${who}`);
} else {
sayHi("Guest");
}
};
ãã®ã³ã¼ãã®åé¡ã¯ãsayHi ã®å¤ãå¤ãããããããªãã¨è¨ããã¨ã§ãã颿°ã¯å¥ã®å¤æ°ã«ãªããã³ã¼ããã¨ã©ã¼ãåãããã«ãªãããããã¾ããã:
let sayHi = function(who) {
if (who) {
alert(`Hello, ${who}`);
} else {
sayHi("Guest"); // Error: sayHi is not a function
}
};
let welcome = sayHi;
sayHi = null;
welcome(); // Error, å
¥ãåã® sayHi å¼ã³åºãã¯ãã以ä¸åä½ãã¾ããï¼
颿°ãå¤é¨ã®ã¬ãã·ã«ã«ç°å¢ãã sayHi ãåå¾ããããã«èµ·ããã¾ãããã¼ã«ã«ã® sayHi ããªãã®ã§ãå¤é¨å¤æ°ã使ããã¾ãããã㦠å¼ã³åºãã®ç¬éãsayHi 㯠null ã§ãã
颿°å¼ã«å ¥ãããã¨ãã§ãããªãã·ã§ã³ã®ååã¯ããã®ç¨®ã®åé¡ã解決ããããã®ãã®ã§ãã
ã³ã¼ããç´ãããã«ããã使ã£ã¦ã¿ã¾ããã:
let sayHi = function func(who) {
if (who) {
alert(`Hello, ${who}`);
} else {
func("Guest"); // ä»ã¯ãã¹ã¦åé¡ããã¾ãã
}
};
let welcome = sayHi;
sayHi = null;
welcome(); // Hello, Guest (ãã¹ãå¼ã³åºãã¯æ©è½ãã¾ã)
åå "func" ã¯é¢æ°ãã¼ã«ã«ãªã®ã§ããã§ãã¾ãåä½ãã¾ããããã¯å¤é¨ã®ãã®ã§ã¯ããã¾ãã(å¤é¨ããã¯è¦ãã¾ãã)ã仿§ã¯å¸¸ã«ç¾å¨ã®é¢æ°ãåç
§ãããã¨ãä¿è¨¼ãã¾ãã
å¤é¨ã³ã¼ãã¯ä¾ç¶ã¨ãã¦å¤æ° sayHi ã¾ãã¯å¾ã® welcome ãæã£ã¦ãã¾ããããã¦ãfunc 㯠âå
é¨ã®é¢æ°åâ ã§ãããèªèº«ãå¼ã³åºãããã®ãã®ã§ãã
ããã§èª¬æããã âå é¨åâ ã®æ©è½ã¯é¢æ°å¼ã§ã®ã¿å©ç¨å¯è½ã§ã颿°å®£è¨ã§ã¯å©ç¨ã§ãã¾ããã颿°å®£è¨ã«å¯¾ãã¦ãããï¼ã¤ã® âå é¨â ã®ååã追å ããæ§æã¯ããã¾ããã
ä¿¡é ¼ã§ããå é¨åãå¿ è¦ãªã¨ãã«ã¯ãããã¯é¢æ°å®£è¨ãååä»ãããã颿°å¼ã®å½¢ã«æ¸ãæããçç±ã«ãªãã¾ãã
ãµããª
颿°ã¯ãªãã¸ã§ã¯ãã§ãã
ããã§ã¯ãç§ãã¡ã¯ãããã®ããããã£ãã«ãã¼ãã¾ãã:
nameâ 颿°åã§ãã颿°å®ç¾©ã§ä¸ããããã¨ãã ãã§ãªããä»£å ¥ããªãã¸ã§ã¯ãã®ããããã£ã«å¯¾ãã¦ãåå¨ãã¾ããlengthâ 颿°å®ç¾©ã§ã®å¼æ°ã®æ°ã§ããæ®ãã®ãã©ã¡ã¼ã¿ã¯ã«ã¦ã³ãããã¾ããã
ãã颿°ã颿°å¼ã¨ãã¦å®£è¨ãã(ã¡ã¤ã³ã³ã¼ãããã¼ã§ã¯ãªãæã§)ãååãæã£ã¦ããå ´åãããã¯ååä»ãããã颿°å¼ã¨å¼ã°ãã¾ãããã®ååã¯å帰å¼ã³åºããªã©ãããããã«å é¨ã§èªèº«ãåç §ããããã«ä½¿ããã¨ãã§ãã¾ãã
ã¾ãã颿°ã¯è¿½å ã®ããããã£ããã¤å ´åãããã¾ããå¤ãã®ç¥ããã¦ããJavaScriptã©ã¤ãã©ãªã¯ãã®æ©è½ãæå¤§éã«æ´»ç¨ãã¦ãã¾ãã
ããã㯠âã¡ã¤ã³ã®â 颿°ãä½ããããã«å¤ãã® âãã«ãã¼â 颿°ãä»ä¸ãã¾ããä¾ãã°ãjquery ã©ã¤ãã©ãªã¯ $ ã¨ããååã®é¢æ°ãä½ãã¾ããlodash ã©ã¤ãã©ãªã¯é¢æ° _ ãä½ãã¾ããããã¦ã _.clone, _.keyBy ãä»ã®ããããã£ã追å ãã¾ã(ãããã«ã¤ãã¦ãã£ã¨ç¥ãããå ´åã¯ãdocs ãåç
§ãã¦ãã ãã)ãå®éã«ã¯ãã°ãã¼ãã«ç©ºéã®æ±æãå°ãªãããããã«ã1ã¤ã®ã©ã¤ãã©ãªã§1ã¤ã®ã°ãã¼ãã«å¤æ°ã®ã¿ãä¸ãããã¾ãã ããã«ãããååã®ç«¶åãçºçããå¯è½æ§ãä½ããªãã¾ãã
ãããã£ã¦ã颿°ã¯åç¬ã§æçãªä»äºããããã¨ãã§ããããããã£ã«ã¯ä»ã®æ©è½ãåãããã¨ãã§ãã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã