æä»¬å·²ç»ç¥éï¼å¨ JavaScript ä¸ï¼å½æ°ä¹æ¯ä¸ä¸ªå¼ã
è JavaScript ä¸çæ¯ä¸ªå¼é½æä¸ç§ç±»åï¼é£ä¹å½æ°æ¯ä»ä¹ç±»åå¢ï¼
å¨ JavaScript ä¸ï¼å½æ°çç±»åæ¯å¯¹è±¡ã
ä¸ä¸ªå®¹æçè§£çæ¹å¼æ¯æå½æ°æ³è±¡æå¯è¢«è°ç¨çâè¡ä¸ºå¯¹è±¡ï¼action objectï¼âãæä»¬ä¸ä» å¯ä»¥è°ç¨å®ä»¬ï¼è¿è½æå®ä»¬å½ä½å¯¹è±¡æ¥å¤çï¼å¢/å 屿§ï¼æå¼ç¨ä¼ éçã
屿§ ânameâ
彿°å¯¹è±¡å å«ä¸äºä¾¿äºä½¿ç¨ç屿§ã
æ¯å¦ï¼ä¸ä¸ªå½æ°çååå¯ä»¥éè¿å±æ§ ânameâ æ¥è®¿é®ï¼
function sayHi() {
alert("Hi");
}
alert(sayHi.name); // sayHi
æ´æè¶£çæ¯ï¼åç§°èµå¼çé»è¾å¾æºè½ãå³ä½¿å½æ°è¢«åå»ºæ¶æ²¡æååï¼åç§°èµå¼çé»è¾ä¹è½ç»å®èµäºä¸ä¸ªæ£ç¡®çååï¼ç¶åè¿è¡èµå¼ï¼
let sayHi = function() {
alert("Hi");
};
alert(sayHi.name); // sayHiï¼æååï¼ï¼
å½ä»¥é»è®¤å¼çæ¹å¼å®æäºèµå¼æ¶ï¼å®ä¹ææï¼
function f(sayHi = function() {}) {
alert(sayHi.name); // sayHiï¼çæäºï¼ï¼
}
f();
è§è䏿è¿ç§ç¹æ§å«åãä¸ä¸æå½åãã妿彿°èªå·±æ²¡ææä¾ï¼é£ä¹å¨èµå¼ä¸ï¼ä¼æ ¹æ®ä¸ä¸ææ¥æ¨æµä¸ä¸ªã
å¯¹è±¡æ¹æ³ä¹æååï¼
let user = {
sayHi() {
// ...
},
sayBye: function() {
// ...
}
}
alert(user.sayHi.name); // sayHi
alert(user.sayBye.name); // sayBye
è¿æ²¡æä»ä¹ç¥å¥çãææ¶ä¼åºç°æ æ³æ¨æµååçæ
åµãæ¤æ¶ï¼å±æ§ name 伿¯ç©ºï¼åè¿æ ·ï¼
// 彿°æ¯å¨æ°ç»ä¸å建ç
let arr = [function() {}];
alert( arr[0].name ); // <空å符串>
// å¼ææ æ³è®¾ç½®æ£ç¡®çååï¼æä»¥æ²¡æå¼
èå®é ä¸ï¼å¤§å¤æ°å½æ°é½æ¯æååçã
屿§ â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
å¯ä»¥çå°ï¼rest åæ°ä¸åä¸è®¡æ°ã
屿§ length ææ¶å¨æä½å
¶å®å½æ°ç彿°ä¸ç¨äºå å
ç/è¿è¡æ¶æ£æ¥ï¼introspectionï¼ã
æ¯å¦ï¼ä¸é¢ç代ç ä¸å½æ° ask æ¥åä¸ä¸ªè¯¢é®çæ¡çåæ° question åå¯è½å
å«ä»»ææ°é handler çåæ° ...handlersã
å½ç¨æ·æä¾äºèªå·±ççæ¡åï¼å½æ°ä¼è°ç¨é£äº handlersãæä»¬å¯ä»¥ä¼ å
¥ä¸¤ç§ handlersï¼
- ä¸ç§æ¯æ å彿°ï¼å®ä» å¨ç¨æ·ç»åºè¯å®åçæ¶è¢«è°ç¨ã
- ä¸ç§æ¯æå彿°ï¼å®å¨ä¸¤ç§æ åµé½ä¼è¢«è°ç¨ï¼å¹¶ä¸è¿åä¸ä¸ªçæ¡ã
ä¸ºäºæ£ç¡®å°è°ç¨ handlerï¼æä»¬éè¦æ£æ¥ handler.length 屿§ã
æä»¬çæ³æ³æ¯ï¼æä»¬ç¨ä¸ä¸ªç®åçæ åæ°ç handler è¯æ³æ¥å¤ç积æçåçï¼æå¸¸è§çåä½ï¼ï¼ä½ä¹è¦è½å¤æä¾éç¨ç handlerï¼
function ask(question, ...handlers) {
let isYes = confirm(question);
for(let handler of handlers) {
if (handler.length == 0) {
if (isYes) handler();
} else {
handler(isYes);
}
}
}
// 对äºè¯å®çåçï¼ä¸¤ä¸ª handler é½ä¼è¢«è°ç¨
// 对äºå¦å®çåçï¼åªæç¬¬äºä¸ª handler 被è°ç¨
ask("Question?", () => alert('You said yes'), result => alert(result));
è¿å°±æ¯æè°ç å¤ææ§ çä¸ä¸ªä¾å ââ æ ¹æ®åæ°çç±»åï¼æè
æ ¹æ®å¨æä»¬çå
·ä½æ
æ¯ä¸ç length æ¥åä¸åçå¤çãè¿ç§ææ³å¨ JavaScript çåºéæåºç¨ã
èªå®ä¹å±æ§
æä»¬ä¹å¯ä»¥æ·»å æä»¬èªå·±ç屿§ã
è¿éæä»¬æ·»å äº counter 屿§ï¼ç¨æ¥è·è¸ªæ»çè°ç¨æ¬¡æ°ï¼
function sayHi() {
alert("Hi");
// 计ç®è°ç¨æ¬¡æ°
sayHi.counter++;
}
sayHi.counter = 0; // åå§å¼
sayHi(); // Hi
sayHi(); // Hi
alert( `Called ${sayHi.counter} times` ); // Called 2 times
被èµå¼ç»å½æ°ç屿§ï¼æ¯å¦ sayHi.counter = 0ï¼ä¸ä¼ å¨å½æ°å
å®ä¹ä¸ä¸ªå±é¨åé counterãæ¢å¥è¯è¯´ï¼å±æ§ counter ååé let counter æ¯æ¯«ä¸ç¸å
³ç两个ä¸è¥¿ã
æä»¬å¯ä»¥æå½æ°å½ä½å¯¹è±¡ï¼å¨å®éé¢åå¨å±æ§ï¼ä½æ¯è¿å¯¹å®çæ§è¡æ²¡æä»»ä½å½±åãåé䏿¯å½æ°å±æ§ï¼åä¹äº¦ç¶ãå®ä»¬ä¹é´æ¯å¹³è¡çã
彿°å±æ§ææ¶ä¼ç¨æ¥æ¿ä»£éå ãä¾å¦ï¼æä»¬å¯ä»¥ä½¿ç¨å½æ°å±æ§å° åéä½ç¨åï¼éå ç« èä¸ counter 彿°çä¾åè¿è¡éåï¼
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
æä»¥ï¼éæ©åªç§å®ç°æ¹å¼åå³äºæä»¬çéæ±æ¯ä»ä¹ã
å½å彿°è¡¨è¾¾å¼
å½å彿°è¡¨è¾¾å¼ï¼NFEï¼Named Function Expressionï¼ï¼æå¸¦æååç彿°è¡¨è¾¾å¼çæ¯è¯ã
ä¾å¦ï¼è®©æä»¬åä¸ä¸ªæ®éç彿°è¡¨è¾¾å¼ï¼
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 æä¸¤ä¸ªç¹æ®çå°æ¹ï¼è¿å°±æ¯æ·»å å®çåå ï¼
- å®å è®¸å½æ°å¨å é¨å¼ç¨èªå·±ã
- å®å¨å½æ°å¤æ¯ä¸å¯è§çã
ä¾å¦ï¼ä¸é¢ç彿° sayHi ä¼å¨æ²¡æå
¥å who æ¶ï¼ä»¥ "Guest" 为å
¥åè°ç¨èªå·±ï¼
let sayHi = function func(who) {
if (who) {
alert(`Hello, ${who}`);
} else {
func("Guest"); // ä½¿ç¨ func 忬¡è°ç¨å½æ°èªèº«
}
};
sayHi(); // Hello, Guest
// ä½è¿ä¸å·¥ä½ï¼
func(); // Error, func is not definedï¼å¨å½æ°å¤ä¸å¯è§ï¼
æä»¬ä¸ºä»ä¹ä½¿ç¨ 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ââ 彿°çååãé常åèªå½æ°å®ä¹ï¼ä½å¦æå½æ°å®ä¹æ¶æ²¡è®¾å®å½æ°åï¼JavaScript ä¼å°è¯éè¿å½æ°çä¸ä¸æçä¸ä¸ªå½æ°åï¼ä¾å¦æèµå¼çåéååä¸ºå½æ°åï¼ãlengthââ 彿°å®ä¹æ¶çå ¥åç个æ°ãRest åæ°ä¸åä¸è®¡æ°ã
妿彿°æ¯éè¿å½æ°è¡¨è¾¾å¼çå½¢å¼è¢«å£°æçï¼ä¸æ¯å¨ä¸»ä»£ç æµéï¼ï¼å¹¶ä¸é带äºååï¼é£ä¹å®è¢«ç§°ä¸ºå½å彿°è¡¨è¾¾å¼ï¼Named Function Expressionï¼ãè¿ä¸ªååå¯ä»¥ç¨äºå¨è¯¥å½æ°å é¨è¿è¡èªè°ç¨ï¼ä¾å¦éå½è°ç¨çã
æ¤å¤ï¼å½æ°å¯ä»¥å¸¦æé¢å¤ç屿§ãå¾å¤ç¥åç JavaScript åºé½å åå©ç¨äºè¿ä¸ªåè½ã
å®ä»¬å建ä¸ä¸ªâ主â彿°ï¼ç¶åç»å®éå å¾å¤å
¶å®âè¾
å©â彿°ãä¾å¦ï¼jQuery åºå建äºä¸ä¸ªå为 $ ç彿°ãlodash åºå建ä¸ä¸ª _ 彿°ï¼ç¶å为å
¶æ·»å äº _.addã_.keyBy 以åå
¶å®å±æ§ï¼æ³è¦äºè§£æ´å¤å
容ï¼åæ¥é
docsï¼ãå®é
ä¸ï¼å®ä»¬è¿ä¹åæ¯ä¸ºäºåå°å¯¹å
¨å±ç©ºé´ç污æï¼è¿æ ·ä¸ä¸ªåºå°±åªä¼æä¸ä¸ªå
¨å±åéãè¿æ ·å°±éä½äºå½åå²çªçå¯è½æ§ã
æä»¥ï¼ä¸ä¸ªå½æ°æ¬èº«å¯ä»¥å®æä¸é¡¹æç¨çå·¥ä½ï¼è¿å¯ä»¥å¨èªèº«ç屿§ä¸é带许å¤å ¶ä»åè½ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼