A re-introduction to JavaScript (JS Tutorial)Introduction
¿Ö "´Ù½Ã-¹è¿ì±â" (re-introduction) ¶ó´Â Ç¥ÇöÀ» ½è´Â°¡? ¿Ö³ÄÇϸé
JavaScript ´Â °¡Àå
À߸ø ÀÌÇØÇÏ´Â °æ¿ì°¡ ¸¹Àº ¾ð¾î À̱⠶§¹®ÀÌ´Ù. Á¾Á¾ °ú¼ÒÆò°¡ ¹ÞÁö¸¸, ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ ´Ü¼øÇÔ µÚ¿¡´Â ¸Å¿ì °·ÂÇÑ ±â´ÉÀÌ ¼û°ÜÁ® ÀÖ´Ù.
2005 ³âºÎÅÍ ¾ÆÁÖ °·ÂÇÑ ÀÚ¹Ù½ºÅ©¸³Æ® ¾îÇø®ÄÉÀ̼ÇÀÌ µîÀåÇÏ¿´À¸¸ç, ÀÌ ¾îÇø®ÄÉÀ̼ǵéÀº, À¥ °³¹ßÀÚ°¡ ÀÚ¹Ù½ºÅ©¸³Æ®¸¦ ±íÀÌ ÀÌÇØÇؾßÇÑ´Ù´Â
°ÍÀ» º¸¿©ÁØ´Ù.
¾ð¾îÀÇ ¿ª»ç¸¦ ¸ÕÀú »ìÆ캸ÀÚ. ÀÚ¹Ù½ºÅ©¸³Æ®´Â 1995 ³â, Netscape ÀÇ °³¹ßÀÚ¿´´ø Brendan Eich °¡ ¸¸µé¾ú°í, 1996
³â ÃÊ¿¡ Netscape 2 ¿Í ÇÔ²² Ãâ½ÃµÇ¾ú´Ù. ¿ø·¡´Â LiveScript ¶ó°í ºÎ¸£·Á°í ÇÏ¿´À¸³ª, Java ÀÇ Àα⿡ Æí½ÂÇÏ·Á´Â ¸¶ÄÉÆÃ
Àü·«À¸·Î À̸§ÀÌ ¹Ù²î¿´´Ù - À̸§À¸·Î ÀÎÇÏ¿© »ç¶÷µéÀÌ Çò°¥·Á ÇÏÁö¸¸ ÀÚ¹Ù¿Í ÀÚ¹Ù½ºÅ©¸³Æ®´Â ´Ù¸¥ ¾ð¾îÀÌ°í °øÅëÁ¡ÀÌ º°·Î ¾ø´Ù.
¸¶ÀÌÅ©·Î¼ÒÇÁÆ®´Â ¸î°³¿ù ÈÄ IE 3 ¿¡ JScript ¶ó´Â ¾ð¾î¸¦ Ãâ½ÃÇÏ¿´´Ù. ³Ý½ºÄÉÀÌÇÁ´Â
Ecma International À̶ó´Â À¯·´ Ç¥ÁØÈ
±â±¸¿¡ ÀÚ¹Ù½ºÅ©¸³Æ®¸¦ Á¦ÃâÇÏ¿´°í, ±× °á°ú°¡ 1997 ³âÀÇ
ECMAScript Ç¥ÁØÀÌ´Ù. ÀÌ Ç¥ÁØÀº 1999 ³â
ECMAScript edition 3 ·Î ´ë´ëÀûÀÎ °³ÆíÀÌ µÇ°í, ±× ÀÌÈÄ·Î Å« º¯ÇÔÀÌ ¾ø¾ú´Ù. 4 ¹ø° ¹öÀüÀº, ¾ð¾îÀÇ º¹À⼺¿¡
´ëÇÑ Á¤Ä¡Àû °ßÇØ Â÷ÀÌ·Î, Æó±âµÇ¾ú´Ù. 5 ¹ø° ¹öÀüÀº, 4 ¹ø° ¹öÀüÀ» ±âÃÊ·Î 2009 ³â °Ü¿ï¿¡ ¹ßÇ¥µÇ¾ú´Ù.
ÀÌ·± ¾ÈÁ¤¼ºÀº (¿ªÁÖ: ÀÚ¹Ù½ºÅ©¸³Æ®°¡ ¿À·¨µ¿¾È º¯ÇÏÁö ¾Ê¾Ò´Ù´Â °Í) °³¹ßÀÚ¿¡°Ô´Â ÁÁÀº ¼Ò½ÄÀÌ´Ù. ³ª´Â ÁÖ·Î ¹öÀü 3 ¿¡ ´ëÇØ ´Ù·ê
°ÍÀÌ´Ù.
´ëºÎºÐÀÇ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿Í´Â ´Ù¸£°Ô, ÀÚ¹Ù½ºÅ©¸³Æ®´Â ÀԷ°ú Ãâ·Â¿¡ ´ëÇÑ °³³äÀÌ ¾ø´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®´Â host ȯ°æ¿¡¼ ½ºÅ©¸³Æ® ¾ð¾î·Î
»ç¿ëµÇ°Ô ¼³°èµÇ¾úÀ¸¸ç, ¿ÜºÎ ¼¼°è¿Í ¼ÒÅëÇÏ´Â °ÍÀº host ȯ°æÀÌ Ã¥ÀÓÁö°Ô µÈ´Ù. °¡Àå ÈçÇÏ°Ô »ç¿ëµÇ´Â host ȯ°æÀº ºê¶ó¿ìÀúÀÌ´Ù. ÇÏÁö¸¸
ÀÚ¹Ù½ºÅ©¸³Æ® ÀÎÅÍÇÁ¸®ÅÍ´Â Adobe Acrobat, Photoshop, Yahoo ÀÇ À§Á¬ ¿£Áø, ¶Ç´Â
node.js °°Àº ¼¹ö ȯ°æ¿¡¼µµ ½ÇÇàµÉ
¼ö ÀÖ´Ù.
Overview
ÀÚ¹Ù½ºÅ©¸³Æ®´Â °´Ã¼ÁöÇâ ¾ð¾îÀÌ°í, dynamic ¾ð¾îÀÌ´Ù (¿ªÁÖ: dynamic À̶õ ´Ù¸¥ ¾ð¾î¿¡¼ ÄÄÆÄÀϽÿ¡ ÇÒ ÀÏÀ», ½Ç½Ã°£¿¡
ÇÏ´Â °æ¿ì°¡ ¸¹Àº ¾ð¾î¶õ ¶æ). ÀÚ¹Ù½ºÅ©¸³Æ®¿¡´Â ŸÀÔÀÌ ÀÖ°í, operator (¿¬»êÀÚ), ÇÙ½É °´Ã¼µé°ú ÇÔ¼öµéÀÌ ÀÖ´Ù. ¹®¹ýÀº Java
¿Í C ¾ð¾î¸¦ Â÷¿ëÇÏ¿©, ÀÌ µÎ ¾ð¾îÀÇ ±¸Á¶Àû Ư¼ºÀ» ÀÚ¹Ù½ºÅ©¸³Æ®°¡ °¡Áö°í ÀÖ´Â °æ¿ìµµ ¸¹´Ù. °¡Àå Å« Â÷ÀÌÁ¡Àº, ÀÚ¹Ù½ºÅ©¸³Æ®¿¡´Â Ŭ·¡½º°¡
¾ø´Ù´Â °ÍÀÌ´Ù; ´ë½Å¿¡ Ŭ·¡½º ±â´ÉÀº °´Ã¼ prototype ¿¡ ÀÇÇØ ±¸ÇöµÈ´Ù. ¶Ç ´Ù¸¥ Â÷ÀÌÁ¡Àº ÇÔ¼ö°¡ °´Ã¼¶ó´Â °ÍÀÌ´Ù; ½ÇÇàÄڵ带 °¡Áö°í
ÀÖ´Â ÇÔ¼ö¸¦ ´Ù¸¥ °´Ã¼µéó·³ À̸® Àú¸® Àü´ÞÇÒ ¼ö ÀÖ´Ù.
¸ðµç ¾ð¾îµéÀÇ °¡Àå ±âº»ÀûÀÎ ±¸¼º¿ä¼Ò¶ó°í ÇÒ ¼ö ÀÖ´Â "ŸÀÔ" ºÎÅÍ ¸ÕÀú »ìÆ캸ÀÚ. ÀÚ¹Ù½ºÅ©¸³Æ® ÇÁ·Î±×·¥Àº °ªÀ» ´Ù·ç¸ç, ÀÌ °ªµéÀº
ŸÀÔÀ» °¡Áø´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ Å¸ÀÔµéÀº ´ÙÀ½°ú °°´Ù:
... ¾Æ, ±×¸®°í Undefined ¿Í Null ÀÌ ÀÖ´Ù. Ưº°ÇÑ °´Ã¼ (object) ŸÀÔÀÎ
Arrays µµ ÀÖ´Ù.
Dates ¿Í
Regular Expressions °´Ã¼ ŸÀÔµµ ÀÖ´Ù. ±×¸®°í Á¤È®È÷ ¸»ÇÏÀÚ¸é, ÇÔ¼öµµ Ưº°ÇÑ °´Ã¼ ŸÀÔÀÌ´Ù. µû¶ó¼ ŸÀÔµéÀ» Á»
´õ ÀÚ¼¼È÷ ³ª¿ÇÏ¸é ´ÙÀ½°ú °°´Ù:
- Number
- String
- Boolean
- Object
- Function
- Array
- Date
- RegExp
- Null
- Undefined
Error ŸÀÔµµ ÀÖ±ä ÇÏ´Ù. ÀÌ ¹®¼¿¡¼´Â ÆíÀÇ»ó, ù¹ø° ¸®½ºÆ®¸¦ ÀÌ¿ëÇÏ¿© ¼³¸íÇÏ°Ú´Ù.
Numbers
ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ ¼ýÀÚ´Â, Ç¥ÁØ ¹®¼¿¡ µû¸£¸é "double-precision 64-bit format IEEE 754 values"
ÀÌ´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®¿¡´Â integer (Á¤¼ö) ¶ó´Â °ÍÀÌ ¾ø´Ù. µû¶ó¼ »ê¼ú Ç¥ÇöÀ» ´Ù·ê ¶§, Á¶½ÉÇØ¾ß ÇÑ´Ù:
0.1 + 0.2 == 0.30000000000000004
ÇÏÁö¸¸ ½ÇÁ¦·Î´Â, ºê¶ó¿ìÀúµéÀº integer °ªÀ» 32-bit integer ·Î ó¸® ÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ÀÚ¼¼ÇÑ »çÇ×Àº
http://www.hunlock.com/blogs/The_Complete_Javascript_Number_Reference">The
Complete JavaScript Number Reference À» ÂüÁ¶Çϱ⠹ٶõ´Ù.
´õÇϱâ, »©±â, modulus µîµîÀÇ
¼öÄ¢ ¿¬»ê ÀÌ Á¦°øµÈ´Ù. Á»Àü¿¡ ¾ê±âÇÏ±æ ±î¸Ô¾ú´Âµ¥,
Math ¶ó´Â ³»Àå °´Ã¼¸¦ ÀÌ¿ëÇÏ¿©, °í±Þ °è»êÀ» ÇÒ ¼ö°¡ ÀÖ´Ù:
Math.sin(3.5);
var d = Math.PI * r * r;
parseInt() ¸¦ ÀÌ¿ëÇÏ¿©, string À» integer ·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù. º¯È¯½Ã »ç¿ëÇÒ base ¸¦ µÎ¹ø° ÀÎÀÚ·Î ¹Þ´Â´Ù:
> parseInt("123", 10)
123
> parseInt("010", 10)
10
base ÀÎÀÚ¸¦ Àü´ÞÇÏÁö ¾ÊÀ¸¸é, ÀÌÀü ºê¶ó¿ìÀúµé (2013 ³â ÀÌÀüÀÇ) ¿¡¼ ¿¹»óÄ¡ ¸øÇÑ °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù:
> parseInt("010")
8
parseInt
°¡ ù 0 À» º¸°í base ¸¦ 8 ·Î »ç¿ëÇ߱⠶§¹®ÀÌ´Ù.
2 Áø¼ö¸¦ 10 Áø¼ö·Î ¹Ù²Ù·Á¸é:
> parseInt("11", 2)
3
float ¼ýÀÚµµ
parseFloat() ¸¦ ÀÌ¿ëÇÏ¿© º¯È¯ÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â Ç×»ó base 10 À» »ç¿ëÇÑ´Ù.
+
¿¬»êÀÚ¸¦ ÀÌ¿ëÇÏ¿© °ªÀ» ¼ýÀÚ·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù:
> + "42"
42
string ÀÌ ¼ýÀÚ·Î º¯ÇüµÉ ¼ö ¾øÀ» ¶§¿¡´Â
NaN (Not a Number) À̶ó´Â Ưº°ÇÑ °ªÀÌ ¸®ÅϵȴÙ.
> parseInt("hello", 10)
NaN
NaN
Àº Àü¿°¼ºÀÌ °ÇÏ´Ù: NaN
À» ¾î¶² ¼ö½Ä¿¡ ÀÔ·ÂÇϸé, ¼ö½Ä¿¡ °ü°è¾øÀÌ °á°ú°ªÀÌ
NaN
ÀÌ µÈ´Ù:
> NaN + 5
NaN
isNaN() À» ÀÌ¿ëÇÏ¿© NaN
ÀÎÁö È®ÀÎÇÒ ¼ö ÀÖ´Ù:
> isNaN(NaN)
true
Infinity ¿Í -Infinity
¶ó´Â °ªµéµµ ÀÖ´Ù:
> 1 / 0
Infinity
> -1 / 0
-Infinity
isFinite() À» ÀÌ¿ëÇÏ¿© Infinity
, -Infinity
NaN
À» Å×½ºÆ®ÇÒ ¼ö ÀÖ´Ù:
> isFinite(1/0)
false
> isFinite(-Infinity)
false
> isFinite(NaN)
false
Note:
parseInt() °ú
parseFloat() ÇÔ¼ö´Â, ¹®ÀÚ¿ÀÇ Ä³¸¯Å͸¦ Çϳª¾¿ Àдٰ¡ ÁöÁ¤ÇÑ ¼ýÀÚ ÇüÅ¿¡ ¸ÂÁö ¾Ê´Â ij¸¯Å͸¦ ¸¸³ª¸é, ÀÌÀü±îÁö ÀÐÀº ¼ýÀÚ¸¦
¸®ÅÏÇÑ´Ù. ¹Ý¸é¿¡ "+" ¿¬»êÀÚ´Â, ÇϳªÀÇ Ä³¸¯ÅÍ¶óµµ ÀÌ»óÀÌ ÀÖÀ¸¸é NaN
À» ¸®ÅÏÇÑ´Ù. Äֿܼ¡¼ "10.2abc"
¶ó´Â °ªÀ», °¢°¢ÀÇ ÇÔ¼öµé¿¡°Ô ³Ñ°Üº¸¸é, ¹«½¼ ¾ê±âÀÎÁö ½±°Ô ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù.
Strings
ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ string Àº ij¸¯ÅÍÀÇ ³ª¿ÀÌ´Ù. Á»´õ Á¤È®È÷ ¸»Çϸé, °¢ ij¸¯ÅÍ°¡ 16-bit ¼ýÀڷΠǥÇöµÇ´Â
Unicode characters ÀÇ ³ª¿ÀÌ´Ù. ·ÎÄöóÀÌ¡À» °èȹÇÏ°í ÀÖ´Â »ç¶÷µé¿¡°Ô´Â Èñ¼Ò½ÄÀÌ´Ù.
ÇϳªÀÇ character ¸¦ Ç¥ÇöÇÏ·Á¸é, ±æÀÌ°¡ 1 ÀÎ string À» »ç¿ëÇÑ´Ù.
string ÀÇ ±æÀÌ´Â
length ¼Ó¼ºÀ» ÀÌ¿ëÇÏ¿© ¾ò´Â´Ù:
> "hello".length
5
string µµ °´Ã¼¶ó´Â ¾ê±â¸¦ ÇÑÀûÀÌ Àִ°¡? string Àº
methods µµ °¡Áö°í ÀÖ´Ù:
> "hello".charAt(0)
h
> "hello, world".replace("hello", "goodbye")
goodbye, world
> "hello".toUpperCase()
HELLO
Other types
ÀÚ¹Ù½ºÅ©¸³Æ®´Â 'object' ŸÀÔÀÇ °´Ã¼À̸é¼, ÀǵµÀûÀ¸·Î "¾ø´Â °ª" (non-value) À» ³ªÅ¸³»´Â null
°ú, 'undefined' ŸÀÔÀÇ °´Ã¼À̸é¼, ÃʱâÈ ÇÏÁö ¾ÊÀº °ªÀ» ³ªÅ¸³»´Â undefined
¸¦ ±¸º°ÇÑ´Ù. º¯¼ö¿¡
´ëÇØ °ð ´Ù·êÅ×Áö¸¸, ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼´Â °ªÀ» ÇÒ´çÇÏÁö ¾Ê°í º¯¼ö¸¦ ¼±¾ðÇÒ ¼ö ÀÖ´Ù. ÀÌ ¶§ÀÇ º¯¼öÀÇ Å¸ÀÔÀº undefined
°¡ µÈ´Ù.
true
¿Í false
°ªÀ» °¡Áú ¼ö ÀÖ´Â, boolean ŸÀÔµµ Á¦°øÇÑ´Ù. ´ÙÀ½ ¹ýÄ¢¿¡
µû¶ó¼, ¾î¶² °ªÀ̵çÁö boolean °ªÀ¸·Î º¯ÇüµÉ ¼ö ÀÖ´Ù.
false
, 0
, ºó ¹®ÀÚ¿ (""
), NaN
,
null
, undefined
´Â ¸ðµÎ false
·Î º¯ÇüµÈ´Ù.
- ´Ù¸¥ ¸ðµç °ªÀº
true
·Î º¯ÇüµÈ´Ù.
Boolean()
ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¸í½ÃÀûÀ¸·Î º¯È¯ÇÒ ¼öµµ ÀÖ´Ù:
> Boolean("")
false
> Boolean(234)
true
ÇÏÁö¸¸, ÀÚ¹Ù½ºÅ©¸³Æ®°¡ ÀÚµ¿À¸·Î º¯È¯À» ÇÏ¿©Áֱ⠶§¹®¿¡, ÀÌ·¸°Ô ÇÏ´Â °æ¿ì´Â µå¹°´Ù.
&&
(³í¸®Àû and), ||
(³í¸®Àû or), !
(³í¸®Àû
not) µîÀÇ boolean ¿¬»êÀÚ°¡ Á¦°øµÈ´Ù.
Variables
»õ·Î¿î º¯¼ö´Â
var Å°¿öµå¸¦ ÀÌ¿ëÇÏ¿© ¼±¾ðÇÑ´Ù:
var a;
var name = "simon";
¼±¾ð½Ã¿¡ °ªÀ» ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é, º¯¼öÀÇ Å¸ÀÔÀº undefined
°¡ µÈ´Ù.
Java µîÀÇ ´Ù¸¥ ¾ð¾î¿Í ´Ù¸¥ Á¡Àº, block (¿ªÁÖ: { ... }
) ÀÌ scope À» ¸¸µéÁö ¾Ê´Â´Ù´Â
°ÍÀÌ´Ù; ÇÔ¼ö¸¸ÀÌ scope À» ¸¸µç´Ù. if
¹® ¾È¿¡, var
¸¦ ÀÌ¿ëÇÏ¿© º¯¼ö¸¦ ¼±¾ðÇϸé,
ÀÌ º¯¼ö´Â ¼ÓÇØÀÖ´Â ÇÔ¼ö Àüü¿¡¼ Á¢±ÙÀÌ °¡´ÉÇÏ´Ù.
Operators
¼ýÀÚ °ü·Ã ¿¬»êÀÚµéÀº +
, -
, *
, /
,
%
(³ª¸ÓÁö ¿¬»êÀÚ) µîÀÌ ÀÖ´Ù. °ªÀº =
·Î ÇÒ´çÇÏ°í, +=
¿Í
-=
µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
x += 5
x = x + 5
++
¿Í --
À» ÀÌ¿ëÇÏ¿© °ªÀ» Áõ°¡/°¨¼Ò ½Ãų ¼ö ÀÖ´Ù. ¾Õ¿¡ ºÙÀÏ ¼öµµ µÚ¿¡ ºÙÀÏ
¼öµµ ÀÖ´Ù.
+ operator ´Â string À» ÇÕÄ¥ ¶§µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
> "hello" + " world"
hello world
string À» ¼ýÀÚ (¶Ç´Â ´Ù¸¥ °ª) ¿¡ ´õÇϸé, ¸ðµç °ÍÀÌ string À¸·Î ¸ÕÀú º¯È¯µÈ´Ù:
> "3" + 4 + 5
345
> 3 + 4 + "5"
75
ÀÌ ±â´ÉÀ» È°¿ëÇϸé, ºó string À» ´õÇÏ¿©, string À¸·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù.
<,>,<=,>=
µîÀ¸·Î
Comparisons (ºñ±³) ÇÒ ¼ö ÀÖ´Ù. ½ºÆ®¸µ°ú ¼ýÀÚ ¸ðµÎ °¡´ÉÇÏ´Ù. °ªÀÌ °°Àº °ÍÀ» È®ÀÎÇÏ´Â °ÍÀº ¾à°£ ¼³¸íÀÌ ÇÊ¿äÇÏ´Ù.
==
À» »ç¿ëÇÒ ¶§, ´Ù¸¥ ŸÀÔÀÇ °ª µÎ°³¸¦ ÁÖ¸é, ŸÀÔÀ» º¯È¯ÇÑ´Ù:
> "dog" == "dog"
true
> 1 == true
true
ŸÀÔ º¯È¯¾øÀÌ, °ªÀÌ °°ÀºÁö¸¦ È®ÀÎÇÏ·Á¸é ===
À» »ç¿ëÇÑ´Ù:
> 1 === true
false
> true === true
true
!=
¿Í !==
µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÀÚ¹Ù½ºÅ©¸³Æ®´Â
bitwise operations µµ Á¦°øÇÑ´Ù.
Control structures
ÀÚ¹Ù½ºÅ©¸³Æ®´Â C ¾ð¾î·ùÀÇ ¾ð¾îµé°ú À¯»çÇÑ Á¦¾î¹®µéÀ» Á¦°øÇÑ´Ù. Á¶°Ç¹®Àº if
¿Í else
¸¦ »ç¿ëÇÑ´Ù:
var name = "kittens";
if (name == "puppies") {
name += "!";
} else if (name == "kittens") {
name += "!!";
} else {
name = "!" + name;
}
name == "kittens!!"
while
°ú do-while
¹®µµ Á¦°øÇÑ´Ù. do-while Àº loop ÀÌ ÃÖ¼ÒÇÑ
Çѹø ½ÇÇàµÇ±â¸¦ ¿øÇÒ ¶§ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù:
while (true) {
// ¹«ÇÑ ·ì!!
}
var input;
do {
input = get_input();
} while (inputIsNotValid(input))
ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ for
¹®Àº C ³ª Java ÀÇ for
¹®°ú µ¿ÀÏÇÏ´Ù:
for (var i = 0; i < 5; i++) {
// Will execute 5 times
}
&&
¿Í ||
¿¬»êÀÚ´Â short-circuit ·ÎÁ÷À» »ç¿ëÇÑ´Ù. Áï, ù¹ø° ¿¬»êÀÚ¿¡
µû¶ó, µÎ¹ø° ÇÇ¿¬»êÀÚ¸¦ ½ÇÇàÇÒ ¼öµµ ÀÖ°í, ±×·¸Áö ¾ÊÀ» ¼öµµ ÀÖ´Ù. °´Ã¼ÀÇ ¼Ó¼ºÀ» Á¢±ÙÇϱâ Àü¿¡ null °´Ã¼ÀÎÁö È®ÀÎÇÒ ¶§ À¯¿ëÇÏ°Ô
¾µ ¼ö ÀÖ´Ù:
var name = o && o.getName();
¶Ç´Â ±âº» °ªÀ» ¼³Á¤ÇÒ ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Ù:
var name = otherName || "default";
´ÙÀ½°ú °°Àº Á¶°Ç¹®µµ °¡´ÉÇÏ´Ù:
var allowed = (age > 18) ? "yes" : "no";
switch ¹®À» ÀÌ¿ëÇÏ¿© ¼ýÀÚ³ª ¹®ÀÚ¿¿¡ µû¶ó ´Ù¸¥ Äڵ带 ½ÇÇàÇÒ ¼ö ÀÖ´Ù:
switch(action) {
case 'draw':
drawit();
break;
case 'eat':
eatit();
break;
default:
donothing();
}
break
¸¦ Ãß°¡ÇÏÁö ¾ÊÀ¸¸é, ´ÙÀ½ case ¹®ÀÌ ½ÇÇàµÈ´Ù. º¸ÅëÀº break
¸¦
Ãß°¡ÇÏÁö¸¸, Á¤¸» ´ÙÀ½ case ¹®À» ½ÇÇàÇϱ⸦ ÀǵµÇÑ °ÍÀ̶ó¸é, ÁÖ¼®À¸·Î ¸í½ÃÇÏ´Â °ÍÀÌ ¾Ë¾Æº¸±â¿¡ ÁÁ´Ù:
switch(a) {
case 1: // ´ÙÀ½ case ·Î ³Ñ¾î°£´Ù
case 2:
eatit();
break;
default:
donothing();
}
default ¹®Àº ¼±ÅûçÇ×ÀÌ´Ù. switch ¿Í case ºÎºÐ¿¡ Ç¥Çö½ÄÀ» »ç¿ëÇÒ ¼öµµ ÀÖ´Ù; µÎ °ªÀº ===
À» ÀÌ¿ëÇÏ¿© ºñ±³µÈ´Ù.
switch(1 + 3) {
case 2 + 2:
yay();
break;
default:
neverhappens();
}
Objects
ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ °´Ã¼´Â ´Ü¼øÈ÷ name-value Æä¾îµéÀÇ ¹À½ÀÌ´Ù. ´ÙÀ½ °Íµé°ú ºñ½ÁÇÏ´Ù:
- Dictionaries in Python
- Hashes in Perl and Ruby
- Hash tables in C and C++
- HashMaps in Java
- Associative arrays in PHP
ÀÌ µ¥ÀÌÅÍ ±¸Á¶°¡ ÀÌ·¸°Ô ¸¹ÀÌ »ç¿ëµÈ´Ù´Â °ÍÀº, ÀÌ µ¥ÀÌÅÍ ±¸Á¶·Î ÇÒ ¼ö ÀÖ´Â ÀÏÀÌ ¸¹´Ù´Â ¹ÝÁõÀÌ´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ ¸ðµç °ÍÀÌ °´Ã¼À̱â
¶§¹®¿¡, ÀÚ¹Ù½ºÅ©¸³Æ® ÇÁ·Î±×·¥Àº hash table À» ¸¹ÀÌ µÚÁ® º¸°Ô µÈ´Ù. Çؽ¬ Å×À̺íÀÌ ºü¸£´Ï ´ÙÇàÀÌ´Ù!
"name" ºÎºÐÀº ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ string ÀÌ°í, value ºÎºÐÀº ¾Æ¹« ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ °ªÀÌ µÉ ¼ö ÀÖ´Ù - ´Ù¸¥ °´Ã¼°¡ µÉ ¼öµµ
ÀÖ´Ù. µû¶ó¼ º¹ÀâÇÑ ÀڷᱸÁ¶¸¦ ¸¸µé ¼ö ÀÖ´Ù.
ºó °´Ã¼¸¦ ¸¸µå´Â µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù:
var obj = new Object();
±×¸®°í ´ÙÀ½ ó·³µµ ÇÒ ¼ö ÀÖ´Ù:
var obj = {};
µÎ°³ÀÇ ±â´ÉÀº °°´Ù; µÎ¹ø° °ÍÀº object literal ¹®¹ýÀ̶ó°í ÇÏ°í, Á» ´õ Æí¸®ÇÏ´Ù. JSON µµ ÀÌ ¹®¹ýÀ» »ç¿ëÇÑ´Ù.
°¡´ÉÇϸé ÀÌ ¹®¹ýÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù.
»ý¼º ÈÄ¿¡´Â, °´Ã¼ÀÇ ¼Ó¼ºÀ» ´ÙÀ½°ú °°Àº µÎ°¡Áö ¹æ¹ýÀ¸·Î Á¢±ÙÇÒ ¼ö ÀÖ´Ù:
obj.name = "Simon";
var name = obj.name;
±×¸®°í ´ÙÀ½Ã³·³...
obj["name"] = "Simon";
var name = obj["name"];
¿ª½Ã³ª °°Àº ¶æÀÌ´Ù. µÎ¹ø° ¹æ¹ýÀº ¼Ó¼ºÀÇ À̸§À» string À¸·Î Áشٴ ÀåÁ¡ÀÌ ÀÖ´Ù. Áï ½Ç½Ã°£À¸·Î string ÀÇ °ªÀ» º¯°æÇÒ
¼ö ÀÖ´Â °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÌ ¹æ¹ýÀ» ¾²¸é ÀÚ¹Ù½ºÅ©¸³Æ® ¿£Áø°ú, minfier ÀÇ ÃÖÀûÈ°¡ Á¶±Ý ´ú µÇ´Â ´ÜÁ¡µµ ÀÖ´Ù. string ¹æ¹ýÀ»
»ç¿ëÇϸé,
¿¹¾à¾î ¸¦ ¼Ó¼ºÀ̸§À¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù:
obj.for = "Simon"; // Syntax error, because 'for' is a reserved word
obj["for"] = "Simon"; // works fine
Object literal ¹®¹ýÀº object Àüü¸¦ ÃʱâÈÇÒ ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Ù:
var obj = {
name: "Carrot",
"for": "Max",
details: {
color: "orange",
size: 12
}
}
¼Ó¼º°ªÀº chain (¿¬°á) ÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ´Ù:
> obj.details.color
orange
> obj["details"]["size"]
12
Arrays
ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼ array ´Â »ç½Ç Ưº°ÇÑ Å¸ÀÔÀÇ object ÀÌ´Ù. ÀÏ¹Ý object ó·³ µ¿ÀÛÇÏÁö¸¸ (¼ýÀÚ ¼Ó¼ºÀº [] ¹®¹ýÀ¸·Î¸¸
Á¢±ÙÇÒ ¼ö ÀÖ´Ù), length
¶ó´Â Ưº°ÇÑ ¼Ó¼ºÀÌ ÀÖ´Ù. ÀÌ °ªÀº Ç×»ó array ÀÇ °¡Àå Å« index + 1
ÀÌ´Ù.
¿¹Àü¿¡´Â array ¸¦ ´ÙÀ½Ã³·³ ¸¸µé¾ú´Ù:
> var a = new Array();
> a[0] = "dog";
> a[1] = "cat";
> a[2] = "hen";
> a.length
3
´ÙÀ½Ã³·³ array literal À» ÀÌ¿ëÇϸé Æí¸®ÇÏ´Ù:
> var a = ["dog", "cat", "hen"];
> a.length
3
array literal ¸¶Áö¸·¿¡ ,
À» Ãß°¡ÇÏ¸é ¾î¶² ºê¶ó¿ìÀú¿¡¼´Â µ¿ÀÛÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù.
,
À» ³¡¿¡ Ãß°¡ÇÏÁö ¸»¾Æ¶ó.
array.length
´Â ¹è¿¾ÈÀÇ ¾ÆÀÌÅÛÀÇ °¹¼ö°¡ ¾Æ´Ò ¼öµµ ÀÖ´Ù. ´ÙÀ½ ¿¹¸¦ º¸¶ó:
> var a = ["dog", "cat", "hen"];
> a[100] = "fox";
> a.length
101
array ÀÇ length ´Â °¡Àå Å« index + 1 ÀÌ´Ù.
Á¸ÀçÇÏÁö ¾Ê´Â index ¸¦ Á¢±ÙÇϸé, undefined
¸¦ ¾ò´Â´Ù:
> typeof a[90]
undefined
´ÙÀ½Ã³·³ array ¸¦ iterate (Çϳª¾¿ ¹æ¹®) ÇÒ ¼ö ÀÖ´Ù:
for (var i = 0; i < a.length; i++) {
// Do something with a[i]
}
length ¼Ó¼ºÀ» ¸Å¹ø ãÁö ¾Ê°í, ´ÙÀ½Ã³·³ Çϸé Á¶±Ý ´õ È¿À²ÀûÀÌ´Ù:
for (var i = 0, len = a.length; i < len; i++) {
// Do something with a[i]
}
´ÙÀ½ ó·³ ÇÒ ¼öµµ ÀÖ´Ù: (¿ªÁÖ: ÀбⰡ ¾î·Á¿ö¼, ±×¸® ÁÁ¾Æº¸ÀÌÁø ¾Ê´Â´Ù)
for (var i = 0, item; item = a[i++];) {
// Do something with item
}
µÎ°³ÀÇ º¯¼ö¸¦ ¼±¾ðÇÏ°í, for
ÀÇ °¡¿îµ¥ ºÎºÐ¿¡¼ °ªÀ» ÇÒ´çÇÏ°í, true ÀÎÁö È®ÀÎÇÑ´Ù - true À̸é
·ìÀ» ½ÇÇàÇÑ´Ù. i
°¡ ¸Å¹ø Áõ°¡µÇ±â ¶§¹®¿¡, array ÀÇ item À» Â÷·Ê·Î ¾ò¾î¿Â´Ù. (undefined
)
°°Àº "falsy" (¿ªÁÖ: false ·Î º¯ÇüµÇ´Â) item À» ¸¸³ª¸é loop À» ¸ØÃá´Ù.
ÀÌ ¹æ¹ýÀº array °¡ "falsy" °ªÀ» °¡ÁöÁö ¾Ê´Â´Ù´Â °ÍÀ» ¾Ë°í ÀÖÀ»¶§¿¡¸¸ »ç¿ëÇ϶ó. ¼ýÀÚ µ¥ÀÌÅ͵éÀ̶ó¸é 0 À» °¡Áú ¼ö ÀÖ°í,
string µ¥ÀÌÅ͵éÀ̶ó¸é ""
À» °¡Áú ¼ö ÀÖÀ¸´Ï, ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ¸é ¾ÈµÈ´Ù. ÀÌ ¶§¿¡´Â i, len
¹æ¹ýÀ» »ç¿ëÇ϶ó.
for...in À» »ç¿ëÇÏ¿© ¹Ýº¹¹®À» ¸¸µé ¼öµµ ÀÖ´Ù. Array.prototype
¿¡ »õ·Î¿î ¼Ó¼ºÀ» Ãß°¡Çϸé,
ÀÌ ¹Ýº¹¹®¿¡¼ ÀÌ ¼Ó¼ºµéµµ iterate ÇÏ°Ô µÉ °ÍÀÌ´Ù:
for (var i in a) {
// Do something with a[i]
}
¾ÆÀÌÅÛÀ» array ¿¡ Ãß°¡ÇÏ·Á¸é, ´ÙÀ½°ú °°ÀÌ ÇÏ´Â °ÍÀÌ ¾ÈÀüÇÏ´Ù:
a[a.length] = item; // a.push(item); ¿Í °°´Ù
a.length
°¡ °¡Àå Å« index + 1 À̱⠶§¹®¿¡, array ÀÇ ³¡¿¡ »õ °ø°£¿¡ °ªÀ» ÇÒ´çÇÏ´Â °ÍÀÌ
µÈ´Ù.
Array ¿¡´Â ´ÙÀ½°ú °°Àº method µéÀÌ ÀÖ´Ù:
Method name |
Description |
a.toString() |
¡¡ |
a.toLocaleString() |
¡¡ |
a.concat(item[, itemN]) |
Returns a new array with the items added on to it. |
a.join(sep) |
¡¡ |
a.pop() |
Removes and returns the last item. |
a.push(item[, itemN]) |
Push adds one or more items to the end. |
a.reverse() |
¡¡ |
a.shift() |
¡¡ |
a.slice(start, end) |
Returns a sub-array. |
a.sort([cmpfn]) |
Takes an optional comparison function. |
a.splice(start, delcount[, itemN]) |
Lets you modify an array by deleting a section and replacing it
with more items. |
a.unshift([item]) |
Prepends items to the start of the array. |
Functions
ÀÚ¹Ù½ºÅ©¸³Æ®¸¦ ÀÌÇØÇÏ·Á¸é, ÇÔ¼ö¸¦ ÀÌÇØÇØ¾ß ÇÑ´Ù. °£´ÜÇÑ ÇÔ¼ö´Â ´ÙÀ½Ã³·³ »ý°å´Ù:
function add(x, y) {
var total = x + y;
return total;
}
ÀÚ¹Ù½ºÅ©¸³Æ® ÇÔ¼ö´Â 0 °³ ÀÌ»óÀÇ À̸§ÀÖ´Â ÀÎÀÚ¸¦ °®´Â´Ù. ÇÔ¼ö´Â ÀÚ½ÅÀÇ º¯¼ö¸¦ ¼±¾ðÇÒ ¼ö ÀÖ´Ù. return
À» ÀÌ¿ëÇÏ¿© ¾î´À ¶§³ª ÇÔ¼ö¸¦ Á¾·áÇÏ°í, °ªÀ» ¸®ÅÏÇÒ ¼ö ÀÖ´Ù. return ¹®À» »ç¿ëÇÏÁö ¾ÊÀ¸¸é (¶Ç´Â return À» °ª ¾øÀÌ »ç¿ëÇϸé),
ÀÚ¹Ù½ºÅ©¸³Æ®´Â undefined
¸¦ ¸®ÅÏÇÑ´Ù.
ÀÎÀÚ´Â »ý·«ÀÌ °¡´ÉÇÏ´Ù. »ý·«ÇÑ °æ¿ì ÀÎÀÚ´Â undefined
°ªÀ» °®´Â´Ù.
> add()
NaN // undefined ¸¦ + ÇÏ¿´´Ù.
ÇÔ¼ö°¡ ¿¹»óÇÏ´Â °Íº¸´Ù ´õ ¸¹Àº ÀÎÀÚ¸¦ Àü´ÞÇÒ ¼öµµ ÀÖ´Ù:
> add(2, 3, 4)
5 // óÀ½ µÎ°³¸¦ ÇÕÇÑ´Ù. 4 ´Â ¹«½ÃµÈ´Ù.
arguments ¶ó´Â º¯¼ö´Â, ÇÔ¼ö¿¡ Àü´ÞµÈ ¸ðµç ÀÎÀÚµéÀ» array ÇüÅ·Π°¡Áö°í ÀÖ´Ù. 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
Æò±ÕÀ» ±¸ÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ¿© º¸ÀÚ:
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()
ÇÔ¼ö´Â ,
·Î ±¸ºÐµÈ ÀÎÀÚµéÀ» ¹Þ´Â´Ù - array ÀÇ Æò±Õ°ªÀ» ±¸ÇÏ·Á¸é
¾î¶»°Ô ÇÒ±î? ´ÙÀ½Ã³·³ ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù:
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
ÇÏÁö¸¸, ¿ì¸®°¡ ÀÌ¹Ì ¸¸µé¾î ³õÀº ÇÔ¼ö¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖÀ¸¸é ´õ ÁÁÀ» °ÍÀÌ´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼´Â,
apply() ¶ó´Â ÇÔ¼ö °´Ã¼ÀÇ method ¸¦ ÀÌ¿ëÇÏ¿©, array ¸¦ ÀÎÀÚ·Î ÇÏ¿©, ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù:
> avg.apply(null, [2, 3, 4, 5])
3.5
apply()
ÀÇ µÎ¹ø° ÀÎÀÚ°¡, ÇÔ¼ö¿¡°Ô Àü´ÞÇÒ ÀÎÀÚµéÀÇ ¹è¿ÀÌ´Ù. ù¹ø° ÀÎÀÚ´Â Á¶±Ý ÀÖ´Ù ¼³¸íÇÒ °ÍÀÌ´Ù.
À§ ¹®Àå¿¡¼, ÇÔ¼ö°¡ °´Ã¼¶ó´Â °ÍÀ» ´Ù½Ã Çѹø º¼ ¼ö ÀÖ´Ù.
ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼´Â À̸§ ¾ø´Â ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù.
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
ÇÔ¼ö¸¦ Àç±ÍÈ£ÃâÇÒ ¼ö ÀÖ´Ù. ºê¶ó¿ìÀúÀÇ
DOM °°Àº tree
±¸Á¶¸¦ ´Ù·ê ¶§ À¯¿ëÇÏ´Ù.
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;
}
À̸§ ¾ø´Â ÇÔ¼ö¸¦ Àç±ÍÀûÀ¸·Î È£ÃâÇÒ ¼ö ÀÖÀ»±î? À̸§ÀÌ ¾ø´Âµ¥ ¸»ÀÌ´Ù. "À̸§ ÀÖ´Â, À̸§¾ø´Â ÇÔ¼ö" (named anonymous
function) À» ¾²¸é µÈ´Ù.
var charsInBody = (function counter(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 += counter(child);
}
return count;
})(document.body);
À̸§ ¾ø´Â ÇÔ¼ö¿¡ ÁÖ¾îÁø À̸§Àº ÀÌ ÇÔ¼öÀÇ scope ¾È¿¡¼¸¸ Á¢±Ù °¡´ÉÇÏ´Ù.
Custom objects
ÀüÅëÀûÀÎ °´Ã¼ÁöÇâ ÇÁ·Î±×·¡¹Ö¿¡¼´Â, °´Ã¼´Â, µ¥ÀÌÅÍ¿Í ÀÌ µ¥ÀÌÅ͸¦ »ç¿ëÇÏ´Â ÇÔ¼öÀÇ ¹À½ÀÌ´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®´Â prototype ±â¹ÝÀÇ
¾ð¾î·Î, C++ À̳ª Java ¿¡ Àִ Ŭ·¡½º ¹®ÀåÀÌ ¾ø´Ù. ´ë½Å¿¡, ÀÚ¹Ù½ºÅ©¸³Æ®´Â ÇÔ¼ö¸¦ Ŭ·¡½º·Î »ç¿ëÇÑ´Ù. first name °ú last
name À» °¡Áö´Â person °´Ã¼°¡ ÀÖ´Ù°í ÇÏÀÚ. "first last" ¶Ç´Â "last, first" ÀÇ ÇüÅ·ΠÀ̸§À» º¸¿©ÁÖ´Â ¹æ¹ýÀÌ
ÀÖ´Ù°í ÇÏÀÚ. ÇÔ¼ö¿Í °´Ã¼¸¦ ÀÌ¿ëÇÏ¿© ´ÙÀ½Ã³·³ ÇÒ ¼ö ÀÖ´Ù:
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 ¿¡ ¾öû³ª°Ô ¸¹Àº ÇÔ¼öµéÀ» °®°Ô µÉ °ÍÀÌ´Ù.
¿ì¸®´Â ÇÔ¼ö¸¦ °´Ã¼¿¡ ºÙÀÏ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ÇÊ¿äÇÏ´Ù. ÇÔ¼öµµ °´Ã¼¶ó´Â »ç½ÇÀ» ÀÌ¿ëÇÏ¿© ´ÙÀ½Ã³·³ ÇÒ ¼ö ÀÖ´Ù:
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[33]
¶ó´Â »õ·Î¿î keyword °¡ µîÀåÇÏ¿´´Ù. ÇÔ¼ö¾È¿¡¼ this
´Â ÇöÀç
°´Ã¼¸¦ ³ªÅ¸³½´Ù. ÇÔ¼ö¸¦ ¾î¶»°Ô È£ÃâÇÏ¿´´ÂÁö¿¡ µû¶ó this
ÀÇ Àǹ̰¡ ´Þ¶óÁö°Ô µÈ´Ù. °´Ã¼¿¡
dot notation or bracket notation (anObject.foo, anObject["foo"]) À» ÀÌ¿ëÇÏ¿©
ÇÔ¼ö¸¦ È£ÃâÇÏ¿´´Ù¸é, ÀÌ °´Ã¼°¡ this
°¡ µÈ´Ù. ±×·¸Áö ¾Ê´Ù¸é this
´Â global
°´Ã¼¸¦ °¡¸®Å°°Ô µÈ´Ù. ÀÚÁÖ ¹üÇÏ´Â ½Ç¼öÁßÀÇ ÇϳªÀÌ´Ù:
> s = makePerson("Simon", "Willison")
> var fullName = s.fullName;
> fullName()
undefined undefined
fullName()
À» È£ÃâÇÒ ¶§, this
´Â global °´Ã¼°¡ µÈ´Ù. ÇÏÁö¸¸ ÀÌ
global °´Ã¼¿¡ 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 ¶ó´Â »õ·Î¿î keyword ¸¦ »ç¿ëÇÏ¿´´Ù. new
´Â this
¿Í ±íÀº ¿¬°üÀÌ
ÀÖ´Ù. new
´Â »õ·Î¿î ºó °´Ã¼¸¦ ¸¸µé°í, ÇÔ¼ö¸¦ È£ÃâÇϸç, ÀÌ ÇÔ¼ö¿¡¼ this
´Â »ý¼ºµÈ
°´Ã¼°¡ µÈ´Ù. new
¸¦ ÀÌ¿ëÇÏ¿© È£ÃâÇÒ ÇÔ¼öµéÀ» constructor ÇÔ¼ö¶ó°í ºÎ¸¥´Ù. °ü·ÊÀûÀ¸·Î ÀÌ ÇÔ¼öµéÀÇ
À̸§Àº ´ë¹®ÀÚ·Î ½ÃÀÛÇÏ°Ô ÇÑ´Ù.
Person °´Ã¼´Â ¸¹ÀÌ °³¼±µÇ¾úÁö¸¸, ¿©ÀüÈ÷ ÁöÀúºÐÇÑ ±¸¼®ÀÌ ÀÖ´Ù. person °´Ã¼¸¦ ¸¸µé¶§¸¶´Ù ÇÔ¼ö °´Ã¼µéÀ» »õ·Î ¸¸µé°í ÀÖ´Â
°ÍÀÌ´Ù - ÀÌ ÄÚµåµéÀ» °øÀ¯ÇÏ´Â °ÍÀÌ ´õ ÁÁÁö ¾Ê°Ú´Â°¡?
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;
}
ÇÔ¼ö¸¦ Çѹø¸¸ »ý¼ºÇÏ°í, constructor ¿¡¼ ÀÌ ÇÔ¼ö °´Ã¼¸¦ ÂüÁ¶ÇÏ¿´´Ù. ´õ °³¼±ÇÒ ¼ö Àִ°¡? ±×·¸´Ù:
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
ÀÇ ¼Ó¼ºÀ» Á¢±ÙÇÒ ¶§, Person
ÀÌ ÀÌ
¼Ó¼ºÀ» °¡Áö°í ÀÖÁö ¾ÊÀ¸¸é, ÀÚ¹Ù½ºÅ©¸³Æ®´Â Person.prototype
¿¡ ÀÌ ¼Ó¼ºÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎÇÑ´Ù. Áï
Person.prototype
¿¡ ¼³Á¤ÇÑ °ÍµéÀº, Person ÀÇ ¸ðµç °´Ã¼µé¿¡¼ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
ÀÌ°ÍÀº ¾ÆÁÖ °·ÂÇÏ´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼´Â ¾î¶² °ÍÀÇ prototype À» ¾Æ¹«¶§³ª º¯°æÇÒ ¼ö ÀÖ´Ù. Áï Á¸ÀçÇÏ´Â °´Ã¼¿¡ method
¸¦ Ãß°¡ÇÒ ¼öµµ ÀÖ´Ù:
> 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
¶ÇÇÑ, ÀÚ¹Ù½ºÅ©¸³Æ®°¡ ±âº» Á¦°øÇÏ´Â °´Ã¼µéÀÇ prototype ¿¡µµ Ãß°¡°¡ °¡´ÉÇÏ´Ù. String
¿¡, string
À» °Å²Ù·Î ¸®ÅÏÇÏ´Â ÇÔ¼ö¸¦ Ãß°¡ÇÏ¿© º¸ÀÚ:
> 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 literal ¿¡µµ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù!
> "This can now be reversed".reversed()
desrever eb won nac sihT
Àá½Ã ¾ð±ÞÇÑ °Íó·³, prototype Àº chain ÇüÅÂÀÌ´Ù. ÀÌ chain ÀÇ root (ÃÖ»óÀ§) ´Â Object.prototype
ÀÌ°í ÀÌ prototype Àº toString()
À» °¡Áö°í ÀÖ´Ù - °´Ã¼¸¦ ¹®ÀÚ¿·Î ³ªÅ¸³¾¶§ ÀÌ ÇÔ¼ö°¡ »ç¿ëµÈ´Ù.
Person
°´Ã¼¸¦ µð¹ö±ëÇÒ ¶§ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù:
> var s = new Person("Simon", "Willison");
> s
[object Object]
> Person.prototype.toString = function() {
return '<Person: ' + this.fullName() + '>';
}
> s
<Person: Simon Willison>
avg.apply()
ÀÇ Ã¹¹ø° ÀÎÀÚ·Î null À» Àü´ÞÇÑ °ÍÀ» ±â¾ïÇϴ°¡? ÀÌÁ¦ ±× ù¹ø° ÀÎÀÚ¸¦ ¼³¸íÇÒ
¼ö ÀÖ´Ù. apply()
ÀÇ Ã¹¹ø° ÀÎÀÚ´Â this
°¡ µÉ °´Ã¼ÀÌ´Ù. ¿¹¸¦µé¾î
new
¸¦ ´ÙÀ½Ã³·³ ±¸ÇöÇÒ ¼ö ÀÖ´Ù:
function trivialNew(constructor) {
var o = {}; // °´Ã¼¸¦ »ý¼ºÇÑ´Ù
constructor.apply(o, arguments);
return o;
}
prototype chain À» ¼³Á¤ÇÏÁö ¾Ê±â ¶§¹®¿¡, new
¶û ¿ÏÀüÈ÷ µ¿ÀÏÇÑ ±â´ÉÀ» ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù.
call À̶ó´Â ÇÔ¼ö´Â apply()
¿Í °°Àºµ¥, ÀÎÀÚ¸¦ ¹è¿´ë½Å, ,
±¸ºÐµÈ ÀÎÀÚ
¸ñ·ÏÀ¸·Î ¹Þ´Â´Ù´Â °ÍÀÌ ´Ù¸£´Ù.
function lastNameCaps() {
return this.last.toUpperCase();
}
var s = new Person("Simon", "Willison");
lastNameCaps.call(s);
// Is the same as:
s.lastNameCaps = lastNameCaps;
s.lastNameCaps();
Inner functions
ÇÔ¼ö ³»¿¡¼ ´Ù¸¥ ÇÔ¼ö¸¦ ¼±¾ðÇÒ ¼ö ÀÖ´Ù. makePerson()
ÇÔ¼ö¿¡¼ ÀÌ¹Ì Çѹø ºÃ¾ú´Ù. Áß¿äÇÑ °ÍÀº,
ºÎ¸ð ÇÔ¼öÀÇ scope ¿¡ ÀÖ´Â º¯¼öµéÀ» ¾ÈÂÊ ÇÔ¼ö¿¡¼ Á¢±ÙÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.
function betterExampleNeeded() {
var a = 1;
function oneMoreThanA() {
return a + 1;
}
return oneMoreThanA();
}
ÀÌ ±â´ÉÀº Äڵ带 °ü¸®Çϱâ ÆíÇÏ°Ô ÇØÁØ´Ù. Áï ¾î¶² ÇÔ¼ö°¡ ´Ù¸¥ ÇÔ¼öµéÀ» »ç¿ëÇϴµ¥, ÀÌ ÇÔ¼öµéÀ» ´Ù¸¥ °÷¿¡¼´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é,
ÀÌ ÇÔ¼öµéÀ» ÇÔ¼öÀÇ ³»ºÎ¿¡ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. global ¿¡ Á¸ÀçÇÏ´Â ÇÔ¼öÀÇ °¹¼ö¸¦ ÁÙÀÌ´Â °ÍÀº ¾ðÁ¦³ª ÁÁÀº ÀÏÀÌ´Ù.
¶ÇÇÑ, ¾ÈÂÊÀÇ ÇÔ¼ö°¡, ¹Ù±ù ÇÔ¼öÀÇ º¯¼ö¸¦ °øÀ¯ÇÒ ¼ö Àֱ⠶§¹®¿¡, global º¯¼ö¸¦ ¼±¾ðÇÏÁö ¾Ê°í, ÇÔ¼ö¾ÈÀÇ º¯¼ö¸¦ °øÀ¯ÇÒ ¼öµµ
ÀÖ´Ù. ÀÌ ¹æ¹ýÀ» ÀÌ¿ëÇÒ ¶§¿¡´Â ÁÖÀÇ°¡ ÇÊ¿äÇϳª, À¯¿ëÇÑ ±â´ÉÀÓ¿¡´Â Ʋ¸²¾ø´Ù.
Closures
ÀÚ¹Ù½ºÅ©¸³Æ®°¡ Á¦°øÇÏ´Â °¡Àå °·ÂÇÏ°íµµ Çò°¥¸®´Â °³³äÁß Çϳª¸¦ ¼³¸íÇÒ Â÷·ÊÀÌ´Ù. ´ÙÀ½ ÄÚµåÀÇ °á°ú´Â ¹«¾ùÀΰ¡?
function makeAdder(a) {
return function(b) {
return a + b;
}
}
x = makeAdder(5);
y = makeAdder(20);
x(6)
?
y(7)
?
makeAdder
¶ó´Â À̸§¿¡ ÈùÆ®°¡ ÀÖ´Ù: Áï »õ·Î¿î add
ÇÔ¼ö¸¦ ¸¸µç´Ù. ÀÌ ÇÔ¼ö´Â,
ÀÎÀÚ Çϳª¸¦ ¹Þ¾Æ¼, ÇÔ¼ö »ý¼º½Ã ¹ÞÀº ÀÎÀÚ¿Í ÇÕÇÑ´Ù.
Á»Àü¿¡ º» inner function ¿¡¼ º» °Í°ú °°Àº ¿ø¸®ÀÌ´Ù: ÇÔ¼ö¾È¿¡ Á¤ÀÇµÈ ÇÔ¼ö´Â, ¹Ù±ù ÇÔ¼öÀÇ º¯¼ö¸¦ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
Â÷ÀÌÁ¡Àº, ¹Ù±ù ÇÔ¼ö°¡ return ÇÏ¿´´Ù´Â °ÍÀÌ´Ù. »ó½ÄÀûÀ¸·Î´Â return ÇÑ ÇÔ¼öÀÇ local º¯¼ö´Â ´õÀÌ»ó Á¸ÀçÇÏÁö ¾Ê°Ô µÈ´Ù.
ÇÏÁö¸¸ ±×µéÀº ¿©ÀüÈ÷ Á¸ÀçÇÑ´Ù - ±×·¸Áö ¾Ê´Ù¸é, adder ÇÔ¼ö´Â µ¿ÀÛÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ´õ¿íÀÌ,
makeAdder
ÀÇ º¯¼öµéÀÇ µÎ°¡Áö "º¹»çº»" ÀÌ Á¸ÀçÇÑ´Ù - ÇÑ °÷¿¡¼´Â a
°¡ 5 ÀÌ°í,
´Ù¸¥ °÷¿¡¼ a
´Â 20 ÀÌ´Ù. µû¶ó¼ À§ ÇÔ¼öÀÇ °á°ú´Â ´ÙÀ½°ú °°´Ù:
x(6) // returns 11
y(7) // returns 27
ÀÚ¹Ù½ºÅ©¸³Æ®°¡ ÇÔ¼ö¸¦ ½ÇÇàÇÒ ¶§, ÇÔ¼ö ³»ÀÇ local º¯¼ö¸¦ ÀúÀåÇϱâ À§ÇØ scope
°´Ã¼°¡ »ý¼ºµÈ´Ù.
scope
°´Ã¼´Â, Àü´ÞµÈ ÇÔ¼ö ÀÎÀÚ¿Í ÇÔ²² ÃʱâȵȴÙ. ÇÔ¼ö°¡ ½ÇÇàµÉ ¶§¸¶´Ù »õ·Î¿î scope °´Ã¼°¡ »ý¼ºµÇ¸ç,
ÀÚ¹Ù½ºÅ©¸³Æ® Äڵ忡¼ ÀÌ scope °´Ã¼¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº ¾ø´Ù. Áï ÇöÀç scope °´Ã¼ÀÇ ¼Ó¼ºµéÀ» iterate ÇÒ ¼ö ÀÖ´Â
¹æ¹ýÀº ¾ø´Ù.
makeAdder
°¡ È£ÃâµÇ¸é, makeAdder
¸¦ È£ÃâÇÒ ¶§ Àü´ÞÇÑ a
¶ó´Â ¼Ó¼ºÀ» °®´Â scope °´Ã¼°¡ »ý¼ºµÈ´Ù. ±×¸®°í makeAdder
´Â »õ·Î »ý¼ºÇÑ ÇÔ¼ö¸¦ ¸®ÅÏÇÑ´Ù. º¸Åë,
ÇÔ¼ö°¡ ¸®ÅÏÇÒ ¶§, ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ garbage collector °¡ makeAdder
È£Ãâ·Î ÀÎÇØ ¸¸µé¾îÁø scope
°´Ã¼¸¦ Áö¿ïÅ×Áö¸¸, ÀÌ ¸®ÅÏµÈ ÇÔ¼ö°¡ scope °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ °¡Áö°í Àֱ⠶§¹®¿¡, scope °´Ã¼°¡ »ç¶óÁöÁö ¾Ê°Ô µÈ´Ù.
Scope °´Ã¼µéÀº scope chain À̶ó ºÒ¸®´Â chain À» Çü¼ºÇÑ´Ù. ¸¶Ä¡ prototype chain ó·³ ¸»ÀÌ´Ù.
closure ´Â ÇÔ¼ö¿Í, ÇÔ¼ö°¡ »ý¼ºµÈ scope °´Ã¼ÀÇ Á¶ÇÕÀÌ´Ù.
closure ¸¦ ÀÌ¿ëÇÏ¿© »óŸ¦ ÀúÀåÇÒ ¼ö ÀÖ´Ù - °´Ã¼ ´ë½Å¿¡ »ç¿ëµÇ°ï ÇÑ´Ù.
Memory leaks
Ŭ·ÎÀú¸¦ »ç¿ëÇϸé Internet Explorer ¿¡¼ ¸Þ¸ð¸® ´©¼ö¸¦ ¹ß»ýÇϱⰡ ¸Å¿ì ½±´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®´Â garbage collected
¾ð¾îÀÌ´Ù - °´Ã¼ »ý¼º½Ã ¸Þ¸ð¸®°¡ ÇÒ´çµÇ°í, °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶°¡ ¸ðµÎ ¾ø¾îÁú ¶§ ¸Þ¸ð¸®°¡ ÇØÁ¦µÈ´Ù. host ȯ°æ¿¡¼ Á¦°øÇÏ´Â °´Ã¼µéÀº
±× ȯ°æ¿¡ ÀÇÇØ Ã³¸®µÈ´Ù.
ºê¶ó¿ìÀú host ´Â HTML ÆäÀÌÁö¸¦ Ç¥ÇöÇÏ´Â °´Ã¼µé, Áï
DOM ÀÇ °´Ã¼µé,
À» °ü¸®ÇÑ´Ù. ºê¶ó¿ìÀú°¡ ÀÌµé °´Ã¼¸¦ À§ÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í ÇØÁ¦ÇÑ´Ù.
Internet Explorer ´Â À̸¦ À§ÇØ ÀÚ¹Ù½ºÅ©¸³Æ®°¡ Á¦°øÇÏ´Â garbage collection °ú´Â º°µµÀÇ garbage
collection À» »ç¿ëÇÑ´Ù. ÀÌ µÎ garbage collection ÀÇ »óÈ£ÀÛ¿ëÀÌ ¸Þ¸ð¸® ´©¼ö¸¦ ¹ß»ý½ÃŲ´Ù.
IE ¿¡¼ ÀÚ¹Ù½ºÅ©¸³Æ® °´Ã¼¿Í native °´Ã¼ »çÀÌ¿¡ ¼øȯ ÂüÁ¶°¡ ¸¸µé¾îÁö¸é ¸Þ¸ð¸® ´©¼ö°¡ ¹ß»ýÇÑ´Ù. (¿ªÁÖ: ¿À·¡µÈ ie ¿¡ ´ëÇÑ
¾ê±â·Î, Å©°Ô ½Å°æ¾²Áö ¾Ê¾Æµµ µÈ´Ù..) ´ÙÀ½ ¿¹¸¦ º¸¶ó:
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';
}
}
À§ ÄÚµå´Â ¿ä¼Ò°¡ Ŭ¸¯µÇ¾úÀ» ¶§ »¡°£»öÀ¸·Î º¯ÇÏ°Ô ÇÑ´Ù. ¸Þ¸ð¸® ´©¼ö°¡ »ý°å´Ù. À̸§¾ø´Â ³»ºÎ ÇÔ¼ö·Î ÀÎÇØ ¸¸µé¾îÁø closure
¿¡ el
ÀÌ Æ÷ÇԵDZ⠶§¹®ÀÌ´Ù. ÀÚ¹Ù½ºÅ©¸³Æ® °´Ã¼ (³»ºÎ ÇÔ¼ö) ¿¡¼ el
À» ÂüÁ¶ÇÏ°í,
native °´Ã¼ el
ÀÌ ³»ºÎÇÔ¼ö¸¦ ÂüÁ¶ÇÏ´Â, ¼øÇÑ ÂüÁ¶°¡ ¸¸µé¾îÁ³´Ù.
ÇØ°áÃ¥ÀÌ ¸î°¡Áö ÀÖ´Ù. °¡Àå °£´ÜÇÑ ¹æ¹ýÀº el
º¯¼ö¸¦ »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ´Ù:
function addHandler(){
document.getElementById('el').onclick = function(){
this.style.backgroundColor = 'red';
}
}
³î¶ø°Ôµµ, closure ·Î ÀÎÇØ »ý±ä ¼øȯ ÂüÁ¶¸¦ ²÷´Â ÇϳªÀÇ ¹æ¹ýÀ¸·Î »õ·Î¿î closure ¸¦ Ãß°¡ÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù:
function addHandler() {
var clickHandler = function() {
this.style.backgroundColor = 'red';
};
(function() {
var el = document.getElementById('el');
el.onclick = clickHandler;
})();
}
¾ÈÂÊ ÇÔ¼ö´Â Áï½Ã ½ÇÇàµÇ¸ç, clickHandler
·Î ÀÎÇØ »ý¼ºµÈ closure ·Î ºÎÅÍ ÀÚ½ÅÀÇ ³»¿ë (¿ªÁÖ:
el) À» ¼û±ä´Ù.
¶Ç ´Ù¸¥ ¹æ¹ýÀº window.onunload
event ¿¡¼ ¼øȯÂüÁ¶¸¦ ²÷´Â °ÍÀÌ´Ù. ¸¹Àº event ¶óÀ̺귯¸®µéÀÌ
ÀÌ·¸°Ô ÇÑ´Ù.
bfcache in firefox 1.5 ±â´ÉÀ» ²ô±â ¶§¹®¿¡, ´Ù¸¥ ÀÌÀ¯°¡ ÀÖÁö ¾Ê´ÂÇÑ, firefox ¿¡¼´Â unload
¸®½º³Ê¸¦ µî·ÏÇÏÁö ¸»¾Æ¶ó.
Original Document Information
- Author: Simon Willison
- Last Updated Date: March 7, 2006
- Copyright: © 2006 Simon Willison, contributed under the Creative Commons:
Attribute-Sharealike 2.0 license.
- More information: For more information about this tutorial (and for
links to the original talk's slides), see Simon's
Etech weblog
post.