éæ°ä»ç´¹ JavaScript
ä»ç´¹
çºä½éè¦éæ°ä»ç´¹ï¼å çº JavaScript å ªç¨±æ¯å ¨ä¸çæè¢«äººèª¤è§£çç¨å¼èªè¨ãå管 JavaScript åæéº¼ç被å²è«·çºå°å ç§ï¼å¨å®èª¤å°äººçç°¡æ½ä¸é±èè強大çèªè¨åè½ã2005 å¹´æ¯å許å¤ç¥å JavaScript æç¨ç¨å¼æ¨åºç年度ï¼å¨å¨èæï¼æ´å çè§£éé ç§æå°ä»»ä½ç¶²é éç¼è ä¾èªªçæ¯éè¦çæè½ã
å å¾è©²èªè¨çæ·å²èªªèµ·ã1995 å¹´ï¼Brendan Eichï¼ä¸ä½ Netscape ï¼ç¶²æ¯ï¼çå·¥ç¨å¸«ï¼åµé äº JavaScriptã1996 å¹´åï¼JavaScript é¨è Netscape 2 馿¬¡æ¨åºãå®åæ¬è¦è¢«å½åçº LiveScriptï¼çµæå çºè¡é·çç¥çºäºå¼·èª¿æé½ç Java ç¨å¼èªè¨çæ®éæ§ï¼èä¸å¹¸ç被æ¹å â å³ä¾¿å ©è ä¹éæ²æå¤ªå¤§çéä¿ã徿¤ä¹å¾ï¼é便æçºäºæ··æ·çå å ã
Microsoft å¨å¹¾åæå¾é¨è IE 3 æ¨åºäºè·è©²èªè¨å¤§è´ä¸ç¸å®¹ç JScriptãNetscape å¨ 1997 å¹´å°è©²èªè¨é交 ECMA Internationalï¼ä¸åææ´²æ¨æºåçµç¹ï¼èå¨ 1997 å¹´çæåç¢çäºåçç ECMAScriptãè©²æ¨æºå¨ 1999 å¹´çæå以 ECMAScript 第ä¸çç形弿¨åºäºæ´æ°ï¼å¾æ¤ä¹å¾å¤§è´ä¸é½ç¸ç¶ç©©å®ï¼ä¸éè¿ææå¨ç ç¼ç¬¬åçã
éåç©©å®æ§å°éç¼è ä¾èªªæ¯ç¸ç¶å¥½çäºæ ï¼å çºå®è®ä¸å°å¯¦ä½ (implementation) ææéæ ¢æ ¢è¶ä¸ãæææé黿¾å¨ç¬¬ä¸ççèªæ³ãçºäºé¿å æ··æ·ï¼ææç¹¼çºä½¿ç¨ JavaScript éåå稱ã
èå ¶ä»ç¨å¼èªè¨å¤§å¤§ä¸åçæ¯ï¼JavaScript æ²æä»»ä½è¼¸å ¥æè¼¸åºçè§å¿µã宿¯è¢«è¨è¨æå¨ä¸å宿主 (host) ç°å¢ä¸å·è¡çè ³æ¬ (script) èªè¨ï¼æä»¥ä»»ä½èå¤çéè¨çæ¹å¼ï¼é½æ¯å®¿ä¸»ç°å¢ç責任ãçè¦½å¨æ¯æå¸¸è¦ç宿主ç°å¢ï¼ä¸éæäºç¨å¼ä¹æ JavaScript è§£éå¨ï¼å¦ Adobe AcrobatãPhotoshopã以å Yahoo! Widget Engine ççã
æ¦è¦
å å¾ä»»ä½èªè¨æåºæ¬çæ¹é¢è¬èµ·ï¼åæ (type)ãJavaScript ç¨å¼å¯ä»¥æ¹è®ãå¼ã(value)ï¼èéäºå¼åèªæå ¶æ¸å±¬çåæ ãJavaScript çåæ æï¼
- Number ï¼æ¸åï¼
- String ï¼å串ï¼
- Boolean ï¼å¸æå¼ï¼
- Function ï¼å½å¼ï¼
- Object ï¼ç©ä»¶ï¼
...以åç¨å¾®æªä¸é»ç undefined ï¼æªå®ç¾©ï¼å null ï¼ç©ºï¼ãéæï¼ç®æ¯ä¸ç¨®ç¹æ®ç©ä»¶ç Array ï¼é£åï¼ãéæï¼é¡å¤çç¹æ®ç©ä»¶ Date ï¼æ¥æï¼ä»¥å Regular Expressionãå¦å¤ï¼å¦æççè¦éå°æè¡ä¸çæºç¢ºæ§ï¼é£å½å¼ä¹åªç®æ¯ä¸ç¨®ç¹æ®çç©ä»¶ãæä»¥åæ åä½è¡¨çèµ·ä¾æè©²å鿍£ï¼
-
Number ï¼æ¸åï¼
-
String ï¼å串ï¼
-
Boolean ï¼å¸æï¼
-
Object ï¼ç©ä»¶ï¼
- Function ï¼å½å¼ï¼
- Array ï¼é£åï¼
- Date ï¼æ¥æï¼
- RegExp
-
Null ï¼ç©ºï¼
-
Undefined ï¼æªå®ç¾©ï¼
å ¶å¯¦ä¹æå §å»ºç Error ï¼é¯èª¤ï¼é¡åï¼ä¸éï¼å æé黿¾å¨ä¸é¢çåä½è¡¨æ¯è¼å®¹æã
æ¸å
æ ¹æè¦æ ¼ï¼JavaScript æ¸åç®æ¯ãé精確度 64 ä½å æ ¼å¼ IEEE 754 å¼ã("double-precision 64-bit format IEEE 754 values")ãéè½é æä¸äºæè¶£ç徿ãJavaScript æ²ææè¬çæ´æ¸ï¼æä»¥ä½ å¨åç®è¡çæåå¾å°å¿ä¸é»ï¼å°¤å ¶æ¯åå¦ä½ ç¿æ £äº C æ Java çæ¸å¸ãå°å¿é¡ä¼¼ä¸ççäºæ ï¼
0.1 + 0.2 = 0.30000000000000004
JavaScript æ¯æ´æ¨æºçæ¸åéç®åï¼å å«å æ³ãæ¸æ³ãå餿¸ãçç®è¡ãå¦å¤éæä¸åä¹åå¿è¨æçå §å»ºç©ä»¶ï¼Math ï¼æ¸å¸ï¼ï¼ç¨ä»¥èçè¼çºé²éçæ¸å¸å½æ¸å常æ¸ï¼
Math.sin(3.5);
d = Math.PI * r * r;
ä½ å¯ä»¥ç¨å
§å»ºç parseInt() å½å¼å°åä¸²è½ææ´æ¸ãéåå½å¼æåå¯é¸ç¨ç第äºå忏ï¼å¨æ¤å»ºè°ä½ ä¸å®è¦æå®ï¼ï¼ç¨ä»¥æå®é²ä½æ¸ã
> parseInt("123", 10)
123
> parseInt("010", 10)
10
å¦æä½ ä¸æå®é²ä½æ¸ï¼å°±æå¯è½å¾å°ææ³ä¸å°ççµæï¼
> parseInt("010")
8
鿝å çº parseInt 彿¸æåä¸²ç¶æå
«é²ä½çæ¸åï¼å çºéé æå 0ã
å¦æè¦æäºé²ä½çæ¸åè½ææ´æ¸ï¼åªè¦æé²ä½æ¸æ¹æå°±è¡äºï¼
> parseInt("11", 2)
3
æåç¹æ®çæ¸åï¼å«å NaN ï¼ãNot a Numberãï¼ã鿏åãç簡稱ï¼ï¼åå¦éé²å»çå䏲䏿¯æ¸åï¼åæåå³ NaN ï¼
> parseInt("hello", 10)
NaN
NaN 徿¯ï¼å°å
¶é²è¡ä»»ä½æ¸å¸éç®ï¼çµæä»ææ¯ NaNï¼
> NaN + 5
NaN
ä½ å¯ä»¥ç¨å
§å»ºç isNaN() å½å¼ä¾å¤æ·ä¸å弿¯å¦çº NaNï¼
> isNaN(NaN)
true
JavaScript ä¹æç¹æ®çå¼ Infinity ï¼ç¡éï¼ä»¥å -Infinity ï¼è² ç¡éï¼ï¼
> 1 / 0
Infinity
> -1 / 0
-Infinity
å串
JavaScript çå串æ¯ä¸åºåçåå ãæ´ç²¾ç¢ºçèªªï¼æ¯ä¸åºåç Unicode åå ï¼æ¯ååå ç以ä¸å 16 ä½å çæ¸åä½çºä»£è¡¨ãéè®ä»»ä½äººä¸éè¦çºåéåæå°æå¿ã
å¦æä½ è¦ä»£è¡¨ä¸åå®ä¸åå ï¼ç¨é·åº¦çº 1 çå串å³å¯ã
è¦å¾ç¥ä¸åå串çé·åº¦ï¼è«åå該å串ç lengthï¼é·åº¦ï¼å±¬æ§ï¼
> "hello".length
5
åå坿¯è JavaScript ç©ä»¶çç¬¬ä¸æ¬¡æ¥è§¸å¢ï¼å䏲乿¯ç©ä»¶åãå串çè³ä¹ææ¹æ³ (method)ï¼
> "hello".charAt(0) //ä½ç½® 0 çåå
h
> "hello, world".replace("hello", "goodbye") //æ hello ææ goodbye
goodbye, world
> "hello".toUpperCase() //è½æå¤§å¯«
HELLO
å ¶ä»é¡å
JavaScript å°ä¸åå
©è
æ¯æåå¥çï¼null ï¼ç©ºï¼ï¼å±¬æ¼ãobjectãåæ
çä¸ç¨®ç©ä»¶ï¼ç¨ä»¥æè¨è¡¨ç¤ºç¡æ¸å¼ï¼ä»¥å undefined ï¼ç¡å®ç¾©ï¼ï¼å±¬æ¼ãundefinedãé¡åçä¸ç¨®ç©ä»¶ï¼ç¨ä»¥è¡¨ç¤ºæªåå§åçå¼ï¼ä¹å°±æ¯èªªï¼æ ¹æ¬éæ²æå®æ¸å¼ãéç¶å§ä¸å
ä¸è«è®æ¸ï¼ä½å¨ JavaScript ä½ å¯ä»¥å®£åä¸åè®æ¸ä½ä¸æå®å
¶å¼ãå¦æä½ é麼åç話ï¼é£è©²è®æ¸çåæ
ä¾¿æ¯ undefinedã
JavaScript æå¸æ (boolean) åæ
ï¼å¯è½ç弿 true ï¼çï¼è false ï¼åï¼ä¸å
©è
ççºééµåãæ ¹æä¸åè¦åï¼ä»»ä½å¼é½å¯ä»¥è¢«è½ææå¸æå¼ï¼
falseã0ã空å串 ("")ãNaNãnullã以åundefined齿æçºfalse- ææå
¶ä»çå¼é½ææçº
true
ä½ å¯ä»¥ç¨ Boolean() å½å¼ç¹å¥é²è¡è½æï¼
> Boolean("")
false
> Boolean(234)
true
ä¸éå¾å°éè¦é樣ï¼å çºåå¦ JavaScript éå°éè¦æ¥æ¶å¸æå¼çæåï¼å¦ if é³è¿°å¼ï¼è¦ä¸ï¼ï¼ä¾¿æç¡è²ç¡æ¯çé²è¡å¸æè½æãæéæ¼æ¤ï¼å¸¸å¸¸ææãçå¼ã("true values") èãåå¼ã("false values") ç說æ³ï¼æææ¯æå¼å¨å¸æè½æéç¨ä¸æè¢«è½æ true ææ¯ falseãé種å¼ä¹æè¢«ç¨±çºãççã("truthy") æãåçã("falsy")ã
JavaScript æ¯æ´å¸æéç®ï¼å¦ && ï¼é輯ãèãï¼è±ç¨± andï¼ã|| ï¼é輯ãæãï¼è±ç¨± orï¼ã以å ! ï¼é輯ãéãï¼è±ç¨± notï¼ï¼è«è¦ä¸ã
è®æ¸
å¨ JavaScriptï¼è¦å®£åæ°è®æ¸ï¼ä½¿ç¨çæ¯ var ééµåï¼
var a;
var name = "simon";
å¦æä½ å®£åä¸åè®æ¸ä½ä¸æå®ä»»ä½å¼ï¼å
¶åæ
ä¾¿çº undefined ï¼æªå®ç¾©ï¼ã æè©²æ³¨æéæ¼ JS çåå¡ä¸ææ§ææ°è®æ¸ä½ç¨å
éç®å
JavaScript çæ¸åéç®åæ +ã-ã*ã/ã以å % - æå¾ä¸åæ¯å餿¸çéç®åï¼è±ç¨± modï¼ãç¨ä¾æå®å¼çéç®åæ¯ =ï¼å¦å¤éæè¤åæå®é³è¿°å¼ï¼å¦ += 以å -=ãéäºæ¯ç¨ä»¥å»¶ä¼¸ x = x éç®å yã
x += 5;
x = x + 5;
ä½ å¯ä»¥ç¨ ++ å -- ä¾åå¥å¢å ææ¯æ¸å°æ¸å¼ãéäºéç®åå¯ä»¥æ¾å¨è®æ¸çéé æçµå°¾ã
+ éç®åä¹è½æå䏲飿¥ (concatenate) èµ·ä¾:
> "hello" + " world"
hello world
å¦æä½ æä¸å串å å°ä¸åæ¸åï¼æå ¶ä»æ¸å¼ï¼ï¼æå æææçæ±è¥¿è½æå串ãéæè®ä½ ææ³ä¸å°ï¼
> "3" + 4 + 5
345
> 3 + 4 + "5"
75
æä¸å空å串å å°ä¸åæ±è¥¿æ¯åå°å ¶è½æå串çå¥½æ¹æ³ä¹ä¸ã
JavaScript ä¸é²è¡æ¯è¼å¯ä»¥ç¨ <ã>ã<=ã以å >=ãéäºå°å䏲忏å齿ç¨ãç弿¯è¼ (equality) æ¯è¼æ²é£éº¼ç´æ¥ãéçèéç®åï¼çæ¼ï¼æé²è¡åæ
å¼·å¶è½æï¼å妿¯è¼çè³æåæ
ä¸ä¸æ¨£ï¼ææçµææç¸ç¶æè¶£ï¼
> "dog" == "dog"
true
> 1 == true
true
è¦é¿å åæ å¼·å¶è½æï¼è¦ç¨ä¸çèéç®åï¼çµå°çæ¼ï¼ï¼
> 1 === true
false
> true === true
true
å¦å¤éæ != ï¼ä¸çæ¼ï¼ä»¥å !== ï¼çµå°ä¸çæ¼ï¼éç®åã
åå¦ä½ éè¦ç¨ç話ï¼JavaScript 乿éä½å (bitwise) éç®åã
æ§å¶çµæ§
JavaScript è·å
¶ä»å屬 C å®¶æçç¨å¼èªè¨æé¡ä¼¼çæ§å¶çµæ§ãæ¢ä»¶é³è¿°å¼æ¯é if 以å else ä¾è¡¨ç¤ºãå¦æä½ åæ¡éå¯ä»¥ä¸²èµ·ä¾ï¼
var name = "è²åª";
if (name == "çç") {
name += "!";
} else if (name == "è²åª") {
name += "!!";
} else {
name = "!" + name;
}
name == "è²åª!!";
JavaScript æ while è¿´å以å do-while è¿´åãåè
é©åååºæ¬çè¿´åï¼èå¾è
æ¯ç¶ä½ è¦è¿´åè³å°å·è¡ä¸æ¬¡å°±éè¦ç¨å°ï¼
while (true) {
// ç¡éè¿´åï¼
}
do {
var input = get_input();
} while (inputIsNotValid(input));
JavaScript ç for è¿´åè· C å Java ç䏿¨£ï¼å¯ä»¥è®ä½ ç¨ä¸è¡å°±æä¾æ§å¶çæ¢ä»¶èè³è¨ã
for (var i = 0; i < 5; i++) {
// æå·è¡ 5 次
}
&& 以å || éç®åç¨çæ¯ãçè·¯é輯ã(short-circuit logic)ï¼ä¹å°±æ¯èªªï¼ç¬¬äºåéç®å¼æ¯å¦æè¢«å·è¡é çæ¯ç¬¬ä¸åéç®å¼ãéç¨ä¾å¨ååä¸åç©ä»¶ç屬æ§å檢æ¥ç©ä»¶æ¯å¦çºç©º (null) é常æç¨ï¼
var name = o && o.getName();
ææ¯ç¨ä¾è¨é è¨å¼ï¼
var name = otherName || "é è¨";
JavaScript 乿ä¸å éç®å (tertiary operator)ï¼å¯ä»¥ç¨ä¾å¯«å®è¡çæ¢ä»¶é³è¿°å¼ï¼
var allowed = age > 18 ? "æ¯" : "å¦";
switch é³è¿°å¼å¯ä»¥æ ¹æä¸åæ¸åæå串åä¸å決å®ï¼
switch (action) {
case "ç«":
drawit(); //éå§ç«
break; //䏿·
case "å":
eatit(); //éå§å
break; //䏿·
default: //é è¨
donothing(); //ä¸åä»»ä½äº
}
å¦æä½ ä¸å å break ï¼ä¸æ·ï¼é³è¿°å¼ï¼å·è¡çç¨å¼ç¢¼æå¾ä¸ãæãä¸å±¤ãä½ å¾å°æéè¦é樣 - ä¸éåå¦ä½ ççè¦éæ¨£ï¼æå¥½ç¨å註解說æä¸ä¸ï¼éæ¨£ææ¹ä¾¿é¤é¯ï¼
switch (a) {
case 1: //å¾ä¸ãæãä¸å±¤
case 2:
eatit(); //éå§å
break; //䏿·
default: //é è¨
donothing(); //ä¸åä»»ä½äº
}
default åå¥ (clause) æ¯é¸ææ§çï¼å¯æå¯ç¡ãå¦æä½ åæ¡ç話ï¼ä½ å¯ä»¥å¨ switch é¨åæ case é¨åæ¾è¡¨éå¼ (expression)ï¼å
©è
ä¹éçæ¯è¼ä½¿ç¨çææ¯ === éç®åï¼
switch (1 + 3) {
case 2 + 2:
yay(); //è¶ï¼
break; //䏿·
default: //é è¨
neverhappens(); //æ ¹æ¬ä¸æç¼ç
}
ç©ä»¶
JavaScript ç©ä»¶æ¯ä¸ç³»åçãåç¨±å°æ¸å¼çµåã(name-value pair)ãæéæ¼æ¤ï¼å®ååä¸åçæ±è¥¿å¾ç¸è¿:
- Python ç dictionary ï¼åå ¸ï¼
- Perl å Ruby ç hash ï¼éæ¹ï¼
- C å C++ ç hash table ï¼éæ¹è¡¨ï¼
- Java ç HashMap ï¼éæ¹å°åï¼
- PHP ç associative array ï¼è¯åé£åï¼
éç¨®è³æçµæ§çæ®éæ§èæäºå ¶å¤æ¨£æ§ãç±æ¼ JavaScript ç任使±è¥¿ï¼æ ¸å¿é¡å以å¤ï¼é½æ¯ç©ä»¶ï¼ä»»ä½ JavaScript ç¨å¼é½èªç¶èç¶çç¨å°è¨±å¤éæ¹è¡¨æ¥è©¢ãé好éäºæ¥è©¢çé度é½å¾å¿«ï¼
ãå稱ãçé¨åæ¯å JavaScript å串ï¼èãæ¸å¼ãå¯ä»¥æ¯ä»»ä½ JavaScript å¼ï¼ï¼å æ¬ç©ä»¶ãéå¯ä»¥è®ä½ é¨å¿ææ¬²ç建æ§è¤éçè³æçµæ§ã
建ç«ç©ºç©ä»¶æç¨®åºæ¬æ¹æ³ï¼
var obj = new Object();
以åï¼
var obj = {};
éå ©è å¨æç¾©ä¸ç¸çï¼å¾è å«åç©ä»¶å¯¦é«èªæ³ (object literal)ï¼æ¯è¼æ¹ä¾¿ãæ©æä¸¦æ²æç©ä»¶å¯¦é«èªæ³ï¼ä¹å°±æ¯çºä½è¨±å¤ç¨å¼ç¢¼ç¨ç鿝èçæ¹æ³ã
䏿¦å»ºç«äºï¼ä¸åç©ä»¶ç屬æ§å¯ä»¥ç¨å ©ç¨®æ¹æ³ååï¼
obj.name = "å°æ";
var name = obj.name;
éæ...
obj["name"] = "å°æ";
var name = obj["name"];
éå ©è 乿¯å¨æç¾©ä¸ç¸çã第äºç¨®æ¹æ³çåªé»æ¯å±¬æ§çå稱å¯ä»¥å¨å·è¡çæå以å串æä¾ï¼ä¹å°±æ¯èªªå¯ä»¥åæ çè®åãéä¹å¯ä»¥ç¨ä¾åå¾åè¨å®å稱æ¯ä¿çééµå (reserved keyword) ç屬æ§ï¼
obj.for = "Simon"; //èªæ³é¯èª¤
obj["for"] = "Simon"; //æ²åé¡
ç©ä»¶å¯¦é«èªæ³å¯ä»¥ä¸æ¬¡æç©ä»¶å®å ¨åå§åï¼
var obj = {
name: "è¡è¿è", //å稱
for: "å°è¯", //給誰
details: {
//詳細è³è¨
color: "æ©", //é¡è²
size: 12, //大å°
},
};
åå屬æ§ä¹å¯ä»¥é£å¨ä¸èµ·ï¼
> obj.details.color
æ©
> obj["details"]["size"]
12
é£å
JavaScript çé£åå ¶å¯¦æ¯ä¸ç¨®ç¹æ®çç©ä»¶ãå®åçé使¹å¼è·æ£å¸¸çç©ä»¶å¾åï¼æ¸åæ§ç屬æ§åªè½éé [] èªæ³é²è¡ååï¼ï¼ä¸éæåç¥å¥ç屬æ§ï¼å«åãlengthãï¼é·åº¦ï¼ãéå屬æ§ä¸å®æ¯é£åæé«ç´¢å¼æ¸å ä¸ã
建ç«é£åçèæ¹æ³å¦ä¸ï¼
> var a = new Array();
> a[0] = "ç";
> a[1] = "è²";
> a[2] = "é";
> a.length
3
æ¯è¼æ¹ä¾¿çèªæ³ä¾¿æ¯ä½¿ç¨é£å實é«èªæ³ï¼
> var a = ["ç", "è²", "é"];
> a.length
3
å¨é£å實é«èªæ³çµå°¾çå空éé»å¨åç覽å¨éçµæåå·®ä¸é½ï¼æä»¥æå¥½ä¸è¦é樣ï¼
> var a = ["ç", "è²", "é", ]; //æå¥½ä¸è¦é麼å
注æï¼ï¼array.length ä¸ä¸å®æ¯é£åçé
ç®æ¸ãæ¯æ¹èªªï¼
> var a = ["ç", "è²", "é"];
> a[100] = "ç";
> a.length
101
å¥å¿äºï¼ï¼é£åç length å°±æ¯æé«ç´¢å¼æ¸å ä¸ã
å¦æä½ æ¥è©¢ä¸åä¸åå¨çé£åç´¢å¼ï¼å¾å°çå°±æ¯ undefinedï¼
> typeof(a[90])
undefined
å©ç¨ä¸è¿°ï¼ä¾¿å¯ä»¥åä¸å䏿¨£å¨é£åä¸åè¿´åï¼
for (var i = 0; i < a.length; i++) {
//èç a[i]
}
鿍£ä¸æ¯å¾ææçï¼å çºæ¯è¿´å䏿¬¡å°±ææ¥è©¢ä¸æ¬¡ length 屬æ§ãæ¯è¼å¥½çåæ³æ¯ï¼
for (var i = 0, len = a.length; i < len; i++) {
//èç a[i]
}
ä¸åæ´æ£çå¯«æ³æ¯ï¼
for (var i = 0, item; (item = a[i]); i++) {
//èç item
}
é裡è¨å®äºå
©åè®æ¸ãfor è¿´åä¸éæå®è®æ¸å¼çé¨åæè¢«æ¸¬è©¦æ¯å¦çºãççã(truthy)ï¼ï¼å¦ææåäºï¼è¿´å便æç¹¼çºãç±æ¼ i æ¯æ¬¡é½æå ä¸ï¼é£åå
§çæ¯åé
ç®æè¢«ç
§é åºæå®å°è®æ¸ itemãç¶åµæ¸¬å°ãåçã(falsy) é
ç®æï¼å¦ undefinedï¼è¿´å便æåæ¢ã
注æï¼ï¼éåå°æå·§åªè©²ç¨å¨ä½ 確å®ä¸æå«æãåçãå¼çé£åï¼æ¯å¦èªªä¸é£åçç©ä»¶æ DOM ç¯é»ï¼ãåå¦ä½ å¨å¯è½å«æ 0 çæ¸åè³ææå¯è½å«æç©ºå串çåä¸²è³æä¸åè¿´åï¼æå¥½éæ¯ç¨ i, j çæ¹å¼ã
å¦å¤ä¸ååè¿´åçæ¹æ³æ¯ç¨ for...in è¿´åãä¸éï¼åå¦æäººç¨ Array.prototype æ°å¢æ°ç屬æ§ï¼é£äºå±¬æ§ä¹æè¢«é種迴åè®å°ï¼
for (var i in a) {
//èç a[i]
}
åå¦ä½ è¦å¨é£åçµå°¾å å ¥é ç®ï¼æå®å ¨çæ¹æ³æ¯é樣ï¼
a[a.length] = item; //å a.push(item);
ç±æ¼ a.length ä¸å®æ¯æé«ç´¢å¼æ¸å ä¸ï¼ä½ å¯ä»¥å¾ç¢ºå®ä½ æå®å°çæ¯é£åçµå°¾ç空éã
é£åéæä¸äºæ¹æ³ (method)ï¼
a.toString(), a.toLocaleString(), a.concat(item, ..), a.join(sep),
a.pop(), a.push(item, ..), a.reverse(), a.shift(), a.slice(start, end),
a.sort(cmpfn), a.splice(start, delcount, [item]..), a.unshift([item]..)
concatçµåï¼æå³åå å ¥äºæ°é ç®çæ°é£åpopæç§»é¤æå¾ä¸åé ç®ä¸¦å°å ¶å³åpushæå¨çµå°¾å å ¥ä¸æå¤åé ç®ï¼å°±åå颿çar.lengthæ¹æ³ï¼sliceå³åå¯é£åsorté²è¡æåºï¼å¯é¸ææ§çæ¥åãæ¯è¼æ§å½æ¸ã(comparison function)spliceè®ä½ ééåªé¤ä¸ååå¡ä¸¦ä»¥æ´å¤é ç®ä»£æ¿ä¾ä¿®æ¹é£åunshiftæå¨éé å å ¥ä¸æå¤åé ç®
å½å¼
å¦åç©ä»¶ï¼å½å¼ (function) æ¯çè§£ JavaScript çæ ¸å¿å ä»¶ãæåºæ¬çå½å¼åç°¡å®ä¸éäºï¼
function add(x, y) {
var total = x + y;
return total;
}
é示ç¯äºåºæ¬å½å¼çä¸åãä¸å JavaScript å½å¼å¯ä»¥æ¥åé¶æå¤åæå (named) 忏ãå½å¼å
§æ (body) è¦æå¤å°é³è¿°å¼å°±æå¤å°é³è¿°å¼ï¼ä¸å¯ä»¥å®£åå°æ¼å½å¼èè¨æ¬å° (local) çè®æ¸ãreturn é³è¿°å¼å¯ä»¥å¨ä»»ä½æåå³åä¸å¼ä¸¦çµæ¢å½å¼ãå¦ææ²æ return é³è¿°å¼ï¼æè
å
æ¯ returnï¼æ²æå¼ï¼ï¼JavaScript 便æå³å undefinedã
æå忏æ¯è¼åæ¯åçºåèï¼èéå¼·å¶æ§çãä½ å¯ä»¥å¼å«ä¸åå½å¼ä½ä¸æä¾å
¶è¦æ±ç忏ï¼å¼æ¤å³å
¥çä¾¿æ¯ undefinedã
> add()
NaN // undefined ä¸è½é²è¡å æ³
ä½ ä¹å¯ä»¥å³å ¥è¶ éå½å¼è¦æ±ç忏æ¸ç®ï¼
> add(2, 3, 4)
5 // å äºåå
©æ¸ï¼ä¸ç 4
éæè¨±æäºå¯ç¬ï¼ä½å½å¼å¨å
§æå
§éå¯ä»¥ååä¸åå«å arguments çè®æ¸ï¼ä¸åé¡ä¼¼é£åçç©ä»¶ï¼å
§å«ææé給å½å¼çå¼ãæ¹å¯«ä¸ä¸ add å½å¼ä¾¿å¯ä»¥ä½¿å
¶æ¥åç¡ééçå¼ï¼
function add() {
var sum = 0;
for (var i = 0, j = arguments.length; i < j; i++) {
sum += arguments[i];
}
return sum;
}
> add(2, 3, 4, 5)
14
鿍£ä¸¦æ²ææ¯ç´æ¥å¯« 2 + 3 + 4 + 5 ä¾å¾æç¨ã寫åç®å¹³åçå½å¼å§ï¼
function avg() {
var sum = 0;
for (var i = 0, j = arguments.length; i < j; i++) {
sum += arguments[i];
}
return sum / arguments.length;
}
> avg(2, 3, 4, 5)
3.5
鿍£æ»¿æç¨çï¼ä¸éåææ°åé¡äºãavg() å½å¼æ¥åçæ¯åéèåéç忏æ¸
å®ï¼ï¼ä¸éå¦æä½ è¦åä¸é£åçå¹³åå¼å¢ï¼ä½ å¯ä»¥æå½å¼é寫æé樣ï¼
function avgArray(arr) {
var sum = 0;
for (var i = 0, j = arr.length; i < j; i++) {
sum += arr[i];
}
return sum / arr.length;
}
> avgArray([2, 3, 4, 5])
3.5
使¯æå¥½æ¯å¯ä»¥éè¤å©ç¨å·²ç¶å»ºç«å¥½çå½å¼ã幸éçæ¯ï¼JavaScript å¯ä»¥è®ä½ 以ä¸é£åç忏ä¾å¼å«ä¸åå½å¼ãéé çæ¯ä½¿ç¨ä»»ä½å½å¼ç©ä»¶ç apply() æ¹æ³ã
> avg.apply(null, [2, 3, 4, 5])
3.5
apply() ç第äºååæ¸ä¾¿æ¯åçºä¸ç³»å忏çé£åï¼ç¬¬ä¸å忏ç¨å¾ææè¨è«ãé黿¯ï¼å½å¼ä¹æ¯ç©ä»¶ã
JavaScript å¯ä»¥è®ä½ 建ç«å¿å (anonymous) å½å¼ã
var avg = function () {
var sum = 0;
for (var i = 0, j = arguments.length; i < j; i++) {
sum += arguments[i];
}
return sum / arguments.length;
};
éåèªæ³ä¸å function avg() å½¢å¼ç¸çã鿝é常強大çåè½ï¼å çºä½ å¯ä»¥èæ¤å¨å¹³å¸¸è©²æ¾è¡¨éå¼çå°æ¹å¡å
¥ä¸å宿´çå½å¼å®ç¾©ãéå¯ä»¥è®ä½ ç¨å¨åç¨®ä»¤äººææ¡å«çµçæå·§ä¸ãä¸åå¯ä»¥ææ¬å° (local) 忏ãèãèµ·ä¾ï¼ï¼å C ç block scope 䏿¨£ï¼
> var a = 1;
> var b = 2;
> (function() {
var b = 3;
a += b;
})();
> a
4
> b
2
JavaScript è½è®ä½ éè¿´å°å¼å«å½å¼ãéå¨èçæ¨¹ççµæ§çæåç¹å¥æç¨ï¼æ¯å¦ç覽å¨ç DOMã
function countChars(elm) {
if (elm.nodeType == 3) {
// TEXT_NODE
return elm.nodeValue.length;
}
var count = 0;
for (var i = 0, child; (child = elm.childNodes[i]); i++) {
count += countChars(child);
}
return count;
}
以䏿é²äºä¸å使ç¨å¿åå½å¼çæ½å¨åé¡ï¼å¦æå¿åå½å¼æ²æå稱ï¼é£è¦æéº¼æ¨£éè¿´å°èªæå¼å«ï¼çæ¡æ¯ä½¿ç¨ arguments ç©ä»¶ã該ç©ä»¶é¤äºæä¾ä¸ç³»åç忏以å¤ï¼éæä¾äºä¸åå«å arguments.callee ç屬æ§ãéåå±¬æ§ææåçæ¯ç®åçå½å¼ï¼å æ¤å¯ä»¥ç¨ä¾åéè¿´çå¼å«ï¼
var charsInBody = (function (elm) {
if (elm.nodeType == 3) {
// TEXT_NODE
return elm.nodeValue.length;
}
var count = 0;
for (var i = 0, child; (child = elm.childNodes[i]); i++) {
count += arguments.callee(child);
}
return count;
})(document.body);
ç±æ¼ arguments.callee æ¯ç®åçå½å¼ï¼èææçå½å¼é½æ¯ç©ä»¶ï¼ä½ å¯ä»¥å æ¤ç¨ arguments.callee ä¾å¨å¤æ¬¡å¼å«ååå½å¼ä¹éå²åè³æãéåå½å¼æè¨å¾å®è¢«å¼å«éå¤å°æ¬¡ï¼
function counter() {
if (!arguments.callee.count) {
arguments.callee.count = 0;
}
return arguments.callee.count++;
}
> counter()
0
> counter()
1
> counter()
2
èªè¨ç©ä»¶
å°±å ¸åçç©ä»¶å°åç¨å¼è¨è¨èè¨ï¼ç©ä»¶æ¯è³æ (data) 以åéç®è©²è³æçæ¹æ³ (method) ææ§æçéåé« (collection)ãæå以ä¸å嫿å§èåå ©åæ¬ä½çãpersonãï¼äººï¼ç©ä»¶ä¾åçºä¾åãå¨è±æï¼ä¸å人çå§åæå ©ç¨®å¯«æ³ï¼ãå å§ãæãå§, åããå©ç¨ä¹åæ¢è¨çå½å¼èç©ä»¶ï¼å¯«æ³å¦ä¸ï¼
function makePerson(first, last) {
return {
first: first,
last: last
}
}
function personFullName(person) {
return person.first + ' ' + person.last;
}
function personFullNameReversed(person) {
return person.last + ', ' + person.first
}
> s = makePerson("Simon", "Willison");
> personFullName(s)
Simon Willison
> personFullNameReversed(s)
Willison, Simon
éç¶é樣è¡å¾éï¼å¯æ¯é樣å¾éï¼å¨å ¨åå½å空é (global namespace) 裡çäºä¸å å½å¼ãæåéè¦æå½å¼ãéèã(attach) å°ç©ä»¶ä¸ãç±æ¼å½å¼ä¹æ¯ç©ä»¶ï¼é麼å並ä¸é£ï¼
function makePerson(first, last) {
return {
first: first,
last: last,
fullName: function() {
return this.first + ' ' + this.last;
},
fullNameReversed: function() {
return this.last + ', ' + this.first;
}
}
}
> s = makePerson("Simon", "Willison")
> s.fullName()
Simon Willison
> s.fullNameReversed()
Willison, Simon
é裡åºç¾äºä¹åæ²ææéç 'this' ééµåãå¨ä¸åå½å¼å
§ï¼ãthisã æçæ¯ç®åçç©ä»¶ãå
¶çæ£çæç¾©æ¯ç¶ç±ä½ å¼å«å½æ¸çæ¹å¼ä¾æå®ãå¦æä½ ééå¨ç©ä»¶ä¸ä½¿ç¨é»æä¸æ¬èè¨èä¾å¼å«å®ï¼éç©ä»¶å°±æçºãthisãã妿å¨å¼å«ä¸æ²æä½¿ç¨é»è¨èï¼ãthisãå°±æåèå°å
¨åç©ä»¶. éç¶å¸¸é æé¯èª¤ãèä¾ä¾èªªï¼
> s = makePerson("Simon", "Willison")
> var fullName = s.fullName;
> fullName()
undefined undefined
ç¶æåå¼å«fullName()ï¼ãthisã被繫çµå°å
¨åç©ä»¶ã æ¢ç¶æ²æå«å first æ last çå
¨åè®æ¸ï¼æååå¾ç齿¯ undefined ã
æåå¯ä»¥å©ç¨ãthisãééµåç好è便¹é²æåç makePerson å½å¼ï¼
function Person(first, last) {
this.first = first;
this.last = last;
this.fullName = function () {
return this.first + " " + this.last;
};
this.fullNameReversed = function () {
return this.last + ", " + this.first;
};
}
var s = new Person("Simon", "Willison");
æåå¼å
¥äºå¦ä¸åééµåï¼ãnewãã ãnewãèãthisãæå¼·ççéä¿ã ä»çä½ç¨æ¯ç¢çä¸åå
¨æ°ç空ç©ä»¶ï¼ç¶å¾å¼å«æå®çå½å¼ï¼ä½¿ç¨æ°ç©ä»¶çä½çºå½å¼çãthisãã 被ãnewãå¼å«çå½å¼å«åã建æ§å彿¸ã(constructor functions) ã
æ¤ææåå¯ä»¥ç¼ç¾ï¼æ¯æ¬¡ç¢çä¸åæ°ç Person ç©ä»¶é½æå¨å ¶å §é¨éæ°ç¢çå ©åæ°ç function ç©ä»¶ã妿éå ©å function ç©ä»¶åªæä¸ä»½èè®å¤§å®¶å ±ç¨ä¸æ¯æ´å¥½åï¼æä»¥
function personFullName() {
return this.first + " " + this.last;
}
function personFullNameReversed() {
return this.last + ", " + this.first;
}
function Person(first, last) {
this.first = first;
this.last = last;
this.fullName = personFullName;
this.fullNameReversed = personFullNameReversed;
}
好äºï¼å¦æ¤ä¸ä¾æåéå°æ¯ä¸å Person ç©ä»¶é½å ±ç¨åä¸çµ function ç©ä»¶äºã
é£è½ä¸è½åçæ´å¥½å¢ï¼
function Person(first, last) {
this.first = first;
this.last = last;
}
Person.prototype.fullName = function () {
return this.first + " " + this.last;
};
Person.prototype.fullNameReversed = function () {
return this.last + ", " + this.first;
};
Person.prototype æ¯ä¸åç±ææ Person ç©ä»¶å ±äº«çç©ä»¶ãä»å°ç¢çä¸åå¯ä¾æ¥ççéä¿é (æåç¹æ®çåå prototype chain)ã任使åç¶æåæ³è¦ä½¿ç¨æåä¸å¨ Person ä¸å®ç¾©ç property æï¼JavaScript å°±æå° Person.prototype 裡é å°æ¾ãå æ¤ï¼ Person.prototype å°±æçºä¸åææ Person ç©ä»¶å ±ç¨ä¸å¯è¦çä¸åå ±äº«ç©ºé(ç©ä»¶)ã鿝ä¸åæä¾å¼·å¤§å·¥å ·ï¼å è¨±ä½ å¯ä»¥å¨å·è¡çä»»ä½ä¸å»å¢å ç©ä»¶çç¸éå½å¼ã
> s = new Person("Simon", "Willison");
> s.firstNameCaps();
TypeError on line 1: s.firstNameCaps is not a function
> Person.prototype.firstNameCaps = function() {
return this.first.toUpperCase()
}
> s.firstNameCaps()
SIMON
å¦å¤ï¼æè¶£çæ¯ï¼å¨ JavaScript ä¸ï¼ä½ ä¸åªè½å å ¥æ±è¥¿å°ä½ èªåµçç©ä»¶ï¼çè³å¯ä»¥å å ¥å° JavaScript åççç©ä»¶ä¸ï¼å¦ä¸é¢èä¾ï¼
> var s = "Simon";
> s.reversed()
TypeError on line 1: s.reversed is not a function
> String.prototype.reversed = function() {
var r = "";
for (var i = this.length - 1; i >= 0; i--) {
r += this[i];
}
return r;
}
> s.reversed()
nomiS
æåæ°å å ¥ String ç reversed å½å¼äº¦å¯åæå¨å串ç©ä»¶ä¸ï¼å¦ä¸æç¤ºï¼
> "This can now be reversed".reversed()
desrever eb won nac sihT
æ¿æ¥ä»¥åæéçï¼prototype ææ¯ chain çä¸é¨åï¼æ¯ä»¥å¾ç´è§çï¼æ ¹å°±æ¯ Object.prototype äºãå¨ Object.prototype æä¾çç¾å¤å½å¼ä¸å å«ä¸å toString() - ä»å¨ç¶ä½ åµå»ºä¸åå串ç©ä»¶æè¢«å¼å«ãå æ¤æåå¯ä»¥å©ç¨ä»ä¾å°æåç Person ç©ä»¶ debugï¼
> var s = new Person("Simon", "Willison");
> s.toString()
[object Object]
> Person.prototype.toString = function() {
return '<Person: ' + this.fullName() + '>';
}
> s
<Person: Simon Willison>
éè¨å¾å颿éç apply() åï¼ç¶ææåå¨ avg.apply() ç第ä¸å忏éé² nullãç¾å¨æååéé ä¾è§£é apply()ãå ¶å¯¦ apply() ç第ä¸å忏æè¢«ç¶æ "this"ãèä¾ä¾èªªï¼æåå¯ä»¥å©ç¨ apply() 實ä½ä¸å trivialNew() 使ä»çææç忼平æä½¿ç¨ç new()ï¼
function trivialNew(constructor) {
var o = {}; // Create an object
constructor.apply(o, arguments);
return o;
}
ç¶æå鿍£åæï¼ä¸¦ä¸æç¢çä¸åé¡ä¼¼æ¼ new() çå½å¼å¨ prototype ä¸ãæ¤å¤ï¼apply() æä¸åå§å¦¹å½å¼å«å callï¼å·®ç°å¨æ¼ call() æ¥åä¸åå¯è¢«æ´å±ç忏䏲åèéä¸åé£åã
function lastNameCaps() {
return this.last.toUpperCase();
}
var s = new Person("Simon", "Willison");
lastNameCaps.call(s);
// Is the same as:
s.lastNameCaps = lastNameCaps;
s.lastNameCaps();
å·¢çå½å¼
JavaScript å½å¼å®£åå¯ä»¥æ¾å¨å
¶ä»å½å¼å
§ãæåä¹åæå¨ makePerson() å½å¼è¦ééåãå·¢çå½å¼ç䏿¨£éè¦çåè½æ¯ï¼å®åå¯ä»¥ååå
¶æ¯å½å¼ (parent function) çé å (scope) å
§çè®æ¸ï¼
function betterExampleNeeded() {
var a = 1;
function oneMoreThanA() {
return a + 1;
}
return oneMoreThanA();
}
éå°æ¼å¯«æ´å®¹æç¶è·çç¨å¼ç¢¼ä¾èªªå¾æç¨ãå妿å½å¼éè¦å ¶ä»ä¸å ©åå½å¼ï¼èéä¸å ©åå½å¼å¨æ´åç¨å¼çå ¶ä»é¨åé½ä¸éè¦ç¨å°ï¼ä½ 便å¯ä»¥æéäºæè¬ãå·¥å ·å½å¼ã(utility function) çµ¦å·¢çæ§å°å å¨éè¦å®åçå½å¼å §ï¼éå主è¦å½å¼åå¾å ¶ä»å°æ¹å¼å«ã鿍£ä¾¿è½ä¿æå ¨åé å (global scope) çå½å¼ä¸æå¤ªå¤ãä¸å¨å ¨åé çå §å¡å¤ªå¤å½å¼æ¯ä»¶å¥½äºæ ã
éä¹è½åå¶å ¨åè®æ¸ (global variable) çèªæã卿°å¯«è¤éçç¨å¼ç¢¼çæåï¼å¸¸å¸¸æææ³å©ç¨å ¨åè®æ¸ä¾å¨å¤åå½å¼ä¹éå³éæ¸å¼çéç¨®èªæï¼ï¼ä½é麼åï¼ä¾¿æå°è´ç¨å¼ç¢¼é常é£ä»¥ç¶è·ãå·¢çå½å¼å¯èå ¶æ¯å½å¼ä¸èµ·å ±ç¨è®æ¸ï¼å æ¤ä½ å¯ä»¥ç¨éååçä¾å¨é©ç¶çææ©å°å¥½å¹¾åå½å¼é å¨ä¸èµ·ï¼èä¸ç¨ãæ±æãå ¨åå½å空é (global namespace)ï¼ï¼éå¯ä»¥ç¨±åãæ¬å°è®æ¸ã (local variable)ãä½¿ç¨æ¤æå·§ææç¶å°å¿ï¼ä¸éï¼æ¤æå·§ç¸ç¶æç¨ã
éå
æ¥èæåä»ç´¹ä¸ç¨®åå強大å»ä¹å¸¸ä½¿äººå°æçæ©å¶ï¼éå (closure)ãå¨è§£éä¹åï¼æåå ççä¸é¢é段ç¨å¼ï¼ççå·è¡ççµææ¯ä»éº¼ã
function makeAdder(a) {
return function(b) {
return a + b;
}
}
x = makeAdder(5);
y = makeAdder(20);
x(6)
?
y(7)
?
çæ¡ææï¼makeAdder åµé äºä¸å "adder" å½å¼ï¼éåæ°ç "adder" æ¥åä¸å忏䏦å°éå忏å "adder" 被åµé æç忏å å¨ä¸èµ·ã
é裡ç¼ççäºæ å¾é¡ä¼¼å åæéçãå §é¨å½å¼ã(inner function)ï¼ä¸åæ°çå½å¼è¢«åµé å¨å¥çå½å¼å §é¨ï¼ä¸¦ä¸å¯ä»¥æ¥è§¸å°å¤é¢å½å¼çè®æ¸ãä½ä¸åçå°æ¹å¨æ¼ï¼å §é¨å½å¼ä¸ä¸æ¦åå°ä¸å±¤å½å¼ï¼å ¶å ååµé çå §é¨å½å¼ä¸çæ¬å°è®æ¸å°±æ¶æ» äºï¼å çºä½ç¨åçµæäºï¼ãä½å¨éå ä¸ï¼éäºæ¬å°è®æ¸å»ä¾ç¶åå¨ï¼æä¸ç¨®æ¬å°è®æ¸å¨é¢éä½ç¨åçé£ä¸å»è¢«åçµçæè¦ºï¼ï¼ï¼ï¼å¦åæåä¸é¢ä¾åä¸ç adder å°±ç¡æ³éä½äºã說å°é裡ï¼ä½ æè©²ç¥éçµæäºãx(6) æ¯ 11 è y(7) æ¯ 27ã
æ´é²ä¸æ¥è§£éï¼å¨ JavaScript ä¸ï¼åªè¦ä½ éå§å·è¡ä¸åå½å¼ï¼é£éº¼å°±æåºç¾ä¸åãä½ç¨åãç©ä»¶ãä½ç¨åç©ä»¶å¯ä»¥æ ¹æå³å ¥ç忏ä¾ååå§åçåä½ãéè½èµ·ä¾æé»é¡ä¼¼åæ¾ææå ¨åè®æ¸åå ¨å彿¸çå ¨åç©ä»¶ï¼ä½ä»å廿幾é»ä¸åãé¦å ï¼ä¸åæ°çä½ç¨åç©ä»¶æ¯å¨ä»»ä½è©²å½å¼è¢«å·è¡ææç¢çï¼èå ¨åç©ä»¶ç´æ¥ç被使ç¨ï¼èå¿ é é²å ¥è©²ä½ç¨åæè½æä½ã
åè« makeAdderãç¶å®è¢«å¼å«æï¼ä¸åæ°çä½ç¨åç©ä»¶è¢«ç¢çï¼ä¸¦ä¸å¸¶èä¸å property a å¨å ¶ä¸ï¼éæ¯ç±å¼å« makeAdder è å³å ¥çï¼ãé¨å¾ makeAdder åå³ä¸åæ°åµçå½å¼ãæ£å¸¸æ æ³ä¸ï¼JavaScript çåå¾åæ¶æ©å¶çæåæ¶éåä½ç¨åç©ä»¶ï¼ä½å¨æåçä¾åä¸ï¼åå³çå½å¼å»ä¿çäºä¸åå¯ä»¥åæ¬¡è¨ªåæ¤ä½ç¨åç©ä»¶çåç §ãå æ¤ï¼éåä½ç¨åç©ä»¶ä¾¿æ²è¢«çæ£åæ¶ï¼ï¼å¿ é çå°æªä¾æ²æä»»ä½åç §å¯ä»¥æåå®ï¼æ¹è½åæ¶ã
å¤åä½ç¨åç©ä»¶æçµæä½ç¨åé (scope chain)ï¼é¡ä¼¼æ¼ JavaScript ç©ä»¶ç³»çµ±ä¸çååéã
ç°¡å®å°ååçµè«ï¼éå æ¯ä½ç¨åç©ä»¶åä¸åå½å¼ççµåï¼åæ äºå ¶è¢«åµé 乿ççæ ãéå å è¨±ä½ ä¿ççæ ï¼è鿝å¾å¸¸ç¨çåè½ã
è¨æ¶é«æµå¤±
éç¶éå 徿¹ä¾¿ï¼ä½å»å®¹æå¨ IE ä¸é æè¨æ¶é«æµå¤±ã
JavaScript æ¯å ·æåå¾åæ¶ç¹æ§çèªè¨ï¼ç©ä»¶ççæ» 齿¯ç±å·è¡ç°å¢ï¼å¦ç覽å¨ï¼ææ§å¶ã
- è¨æ¶é«é ç½®ï¼åµé ç©ä»¶æ
- è¨æ¶é«éæ¾ï¼ç¶æ²æåç §å¯ä»¥æå該ç©ä»¶æ
ç¶ç覽å¨å¨å·è¡çæåï¼éè¦ç¶è·ä¾èª DOM ç大éç©ä»¶ãIE 使ç¨èªå·±çåå¾åæ¶æ©å¶ï¼èéåç®¡çæ©å¶å JavaScript çä¸åï¼ï¼éå°±é æäºè¨æ¶é«æµå¤±ã
卿åé裡çä¾åä¸ï¼è¨æ¶é«æµå¤±æºèªæ¼ç°ççç¸äºåç § (circular reference)ï¼ï¼ JavaScript ç©ä»¶ååçç©ä»¶ä¹éçç¸äºåç §ã以ä¸é¢çç¨å¼çºä¾ï¼
function leakMemory() {
var el = document.getElementById("el");
var o = { el: el };
el.o = o;
}
æ¤æä¾¿ç¼çäºè¨æ¶é«æµå¤±ãé¤é IE éæ°ååï¼å¦å el å o 使ç¨çè¨æ¶é«çç¡æ³è¢«éæ¾ãé種ä¾å容æå ä¸å°å¿èåºç¾ã
å ¶å¯¦è¨æ¶é«æµå¤±å¾é£å¼èµ·æ³¨æï¼é¤é
- ç¨å¼éè¦é·æå·è¡
- å è¨æ¶é«æµå¤±èæ¶è大éçè¨æ¶é«
- è¿´å䏿顝尿µªè²»è¨æ¶é«
éå 容æç¢çè¨æ¶é«æµå¤±ãå¦ä¸èä¾ :
function addHandler() {
var el = document.getElementById("el");
el.onclick = function () {
this.style.backgroundColor = "red";
};
}
å¨é段ç¨å¼ä¸ï¼æåè¨å®äºä¸å elementï¼è®å®å¯ä»¥å¨è¢«é»é¸æè®ç´ ãé裡形æäºè¨æ¶é«æµå¤±ãä½ ç¼ç¾äºåï¼å çºæå el çåç §ä¸ç¶æå°è¢«ç±å¿åå §é¨å½å¼ç¢ççéå é£çµäºãéå°±å¨ JavaScript ç©ä»¶ (function) ååçç©ä»¶ (el) ä¹éç¢çäºç¸äºåç §ã
å¨ç¾å¯¦çæ´»ä¸å 滿äºé¡ä¼¼çæ¡ä¾ï¼ä½æåå ¶å¯¦å¯ä»¥å¾å®¹æå°èçãçä¸åç°¡å®ç示ç¯ï¼
function addHandler() {
var el = document.getElementById("el");
el.onclick = function () {
this.style.backgroundColor = "red";
};
el = null;
}
妿¤ä¸ä¾æåè§£é¤äºç¸äºåç §ã
æ¤å¤ï¼å°æä¸ç¨®å·§å¦çæ¹å¼å¯ä»¥èç±å¢å ä¸åæ°çéå 便¶é¤ç¸äºåç §ï¼
function addHandler() {
var clickHandler = (function () {
this.style.backgroundColor = "red";
})(function () {
var el = document.getElementById("el");
el.onclick = clickHandler;
})();
}
卿¤ä¾åä¸ï¼é±èäºä¾èª clickHandler ç¢ççå §å®¹ï¼å èæ¶é¤äºç¸äºåç §ã
é¿å
éå
éæå¦å¤ä¸ç¨®æ¹æ³ï¼å©ç¨ window.onunload äºä»¶æ¶é¤ç¸äºåç
§ã許å¤äºä»¶å½ç¤ºåº«é½æèªåé麼åã
åå§æä»¶è³è¨
- ä½è ï¼Simon Willison
- æå¾æ´æ°æ¥æï¼2006 å¹´ 3 æ 7 æ¥
- è使¬ï¼Â© 2006 Simon Willisonï¼Creative Commons: Attribute-Sharealike 2.0 ï¼åµç¨ï¼å§åæ¨ç¤º-ç¸åæ¹å¼å享 2.0ï¼ææ¬ã
- æ´å¤è³è¨ï¼å ¶ä»éæ¼é份æå¸çè³è¨ï¼ä»¥ååä½è æç¨çæå½±çï¼è«åå¾åä½è çç¶²èªï¼Etech weblogã