ÎÒÑо¿JavaScript±Õ°ü£¨closure£©ÒѾÓÐÒ»¶Îʱ¼äÁË¡£ÎÒ֮ǰֻÊÇѧ»áÁËÈçºÎʹÓÃËüÃÇ£¬¶øÃ»ÓÐ͸³¹µØÁ˽âËüÃǾßÌåÊÇÈçºÎÔË×÷µÄ¡£ÄÇô£¬¾¿¾¹Ê²Ã´ÊDZհü£¿
Wikipedia¸ø³öµÄ½âÊͲ¢Ã»ÓÐÌ«´óµÄ°ïÖú¡£±Õ°üÊÇʲôʱºò±»´´½¨µÄ£¬Ê²Ã´Ê±ºò±»Ïú»ÙµÄ£¿¾ßÌåµÄʵÏÖÓÖÊÇÔõôÑùµÄ£¿
"use strict";
var myClosure = (function outerFunction() {
var hidden = 1;
return {
inc: function innerFunction() {
return hidden++;
}
};
}());
myClosure.inc(); // ·µ»Ø 1
myClosure.inc(); // ·µ»Ø 2
myClosure.inc(); // ·µ»Ø 3
// ÏàÐŶÔJSÊìϤµÄÅóÓѶ¼ÄܺܿìÀí½âÕâ¶Î´úÂë
// ÄÇôÔÚÕâ¶Î´úÂëÔËÐеı³ºó¾¿¾¹·¢ÉúÁËÔõÑùµÄÊÂÇéÄØ£¿ |
ÏÖÔÚ£¬ÎÒÖÕÓÚÖªµÀÁ˴𰸣¬ÎҸе½ºÜÐ˷ܲ¢ÇÒ¾ö¶¨Ïò´ó¼Ò½âÊÍÕâ¸ö´ð°¸¡£ÖÁÉÙ£¬ÎÒÒ»¶¨ÊDz»»áÍü¼ÇÕâ¸ö´ð°¸µÄ¡£
Tell me and I forget. Teach me and I remember. Involve me and I learn. ? Benjamin Franklin |
²¢ÇÒ£¬ÔÚÎÒÔĶÁÓë±Õ°üÏà¹ØµÄÏÖ´æµÄ×ÊÁÏʱ£¬ÎÒºÜŬÁ¦µØ³¢ÊÔ×ÅÈ¥ÔÚÄÔº£ÖÐÏëÏëÿ¸öÊÂÎïÖ®¼äµÄÁªÏµ£º¶ÔÏóÖ®¼äÊÇÈçºÎÒýÓõ쬶ÔÏóÖ®¼äµÄ¼Ì³Ð¹ØÏµÊÇʲô£¬µÈµÈ¡£ÎÒÕÒ²»µ½¹ØÓÚÕâЩ¸ºÔð¹ØÏµµÄºÜºÃµÄͼ±í£¬ÓÚÊÇÎÒ¾ö¶¨×Ô¼º»Ò»Ð©¡£
ÎÒ½«¼ÙÉè¶ÁÕß¶ÔJavaScriptÒѾ±È½ÏÊìϤÁË£¬ÖªµÀʲôÊÇÈ«¾Ö¶ÔÏó£¬ÖªµÀº¯ÊýÔÚJavaScriptµ±ÖÐÊÇ¡°first-class
objects¡±£¬µÈµÈ¡£
×÷ÓÃÓòÁ´£¨Scope Chain£©
µ±JavaScriptÔÚÔËÐеÄʱºò£¬ËüÐèҪһЩ¿Õ¼äÈÃËüÀ´´æ´¢±¾µØ±äÁ¿£¨local variables£©¡£ÎÒÃǽ«ÕâЩ¿Õ¼ä³ÆÎª×÷ÓÃÓò¶ÔÏó£¨Scope
object£©£¬ÓÐʱºòÒ²³Æ×÷LexicalEnvironment¡£ÀýÈ磬µ±Äãµ÷Óú¯Êýʱ£¬º¯Êý¶¨ÒåÁËһЩ±¾µØ±äÁ¿£¬ÕâЩ±äÁ¿¾Í±»´æ´¢ÔÚÒ»¸ö×÷ÓÃÓò¶ÔÏóÖС£Äã¿ÉÒÔ½«×÷ÓÃÓòº¯ÊýÏëÏó³ÉÒ»¸öÆÕͨµÄJavaScript¶ÔÏ󣬵«ÊÇÓÐÒ»¸öºÜ´óµÄÇø±ð¾ÍÊÇÄã²»Äܹ»Ö±½ÓÔÚJavaScriptµ±ÖÐÖ±½Ó»ñÈ¡Õâ¸ö¶ÔÏó¡£ÄãÖ»¿ÉÒÔÐÞ¸ÄÕâ¸ö¶ÔÏóµÄÊôÐÔ£¬µ«ÊÇÄã²»Äܹ»»ñÈ¡Õâ¸ö¶ÔÏóµÄÒýÓá£
×÷ÓÃÓò¶ÔÏóµÄ¸ÅÄîʹµÃJavaScriptºÍC¡¢C++·Ç³£²»Í¬¡£ÔÚC¡¢C++ÖУ¬±¾µØ±äÁ¿±»±£´æÔÚÕ»£¨stack£©ÖС£ÔÚJavaScriptÖУ¬×÷ÓÃÓò¶ÔÏóÊÇÔÚ¶ÑÖб»´´½¨µÄ£¨ÖÁÉÙ±íÏÖ³öÀ´µÄÐÐΪÊÇÕâÑùµÄ£©£¬ËùÒÔÔÚº¯Êý·µ»ØºóËüÃÇÒ²»¹ÊÇÄܹ»±»·ÃÎʵ½¶ø²»±»Ïú»Ù¡£
ÕýÈçÄã×öÏëµÄ£¬×÷ÓÃÓò¶ÔÏóÊÇ¿ÉÒÔÓи¸×÷ÓÃÓò¶ÔÏó£¨parent scope object£©µÄ¡£µ±´úÂëÊÔͼ·ÃÎÊÒ»¸ö±äÁ¿µÄʱºò£¬½âÊÍÆ÷½«ÔÚµ±Ç°µÄ×÷ÓÃÓò¶ÔÏóÖвéÕÒÕâ¸öÊôÐÔ¡£Èç¹ûÕâ¸öÊôÐÔ²»´æÔÚ£¬ÄÇô½âÊÍÆ÷¾Í»áÔÚ¸¸×÷ÓÃÓò¶ÔÏóÖвéÕÒÕâ¸öÊôÐÔ¡£¾ÍÕâÑù£¬Ò»Ö±Ïò¸¸×÷ÓÃÓò¶ÔÏó²éÕÒ£¬Ö±µ½ÕÒµ½¸ÃÊôÐÔ»òÕßÔÙҲûÓи¸×÷ÓÃÓò¶ÔÏó¡£ÎÒÃǽ«Õâ¸ö²éÕÒ±äÁ¿µÄ¹ý³ÌÖÐËù¾¹ýµÄ×÷ÓÃÓò¶ÔÏó³Ë×ø×÷ÓÃÓòÁ´£¨Scope
chain£©¡£
ÔÚ×÷ÓÃÓòÁ´ÖвéÕÒ±äÁ¿µÄ¹ý³ÌºÍÔÐͼ̳У¨prototypal inheritance£©ÓÐ×ŷdz£ÏàËÆÖ®´¦¡£µ«ÊÇ£¬·Ç³£²»Ò»ÑùµÄµØ·½ÔÚÓÚ£¬µ±ÄãÔÚÔÐÍÁ´£¨prototype
chain£©ÖÐÕÒ²»µ½Ò»¸öÊôÐÔµÄʱºò£¬²¢²»»áÒý·¢Ò»¸ö´íÎ󣬶øÊÇ»áµÃµ½undefined¡£µ«ÊÇÈç¹ûÄãÊÔͼ·ÃÎÊÒ»¸ö×÷ÓÃÓòÁ´Öв»´æÔÚµÄÊôÐԵϰ£¬Äã¾Í»áµÃµ½Ò»¸öReferenceError¡£
ÔÚ×÷ÓÃÓòÁ´µÄ×î¶¥²ãµÄÔªËØ¾ÍÊÇÈ«¾Ö¶ÔÏó£¨Global Object£©ÁË¡£ÔËÐÐÔÚÈ«¾Ö»·¾³µÄJavaScript´úÂëÖУ¬×÷ÓÃÓòÁ´Ê¼ÖÕÖ»º¬ÓÐÒ»¸öÔªËØ£¬ÄǾÍÊÇÈ«¾Ö¶ÔÏó¡£ËùÒÔ£¬µ±ÄãÔÚÈ«¾Ö»·¾³Öж¨Òå±äÁ¿µÄʱºò£¬ËüÃǾͻᱻ¶¨Ò嵽ȫ¾Ö¶ÔÏóÖС£µ±º¯Êý±»µ÷ÓõÄʱºò£¬×÷ÓÃÓòÁ´¾Í»á°üº¬¶à¸ö×÷ÓÃÓò¶ÔÏó¡£
È«¾Ö»·¾³ÖÐÔËÐеĴúÂë
ºÃÁË£¬ÀíÂÛ¾Í˵µ½ÕâÀï¡£½ÓÏÂÀ´ÎÒÃÇÀ´´Óʵ¼ÊµÄ´úÂëÈëÊÖ¡£
// my_script.js "use strict";
var foo = 1;
var bar = 2; |
ÎÒÃÇÔÚÈ«¾Ö»·¾³Öд´½¨ÁËÁ½¸ö±äÁ¿¡£ÕýÈçÎÒ¸Õ²ÅËù˵£¬´ËʱµÄ×÷ÓÃÓò¶ÔÏó¾ÍÊÇÈ«¾Ö¶ÔÏó¡£

ÔÚÈ«¾Ö»·¾³Öд´½¨Á½¸ö±äÁ¿
ÔÚÉÏÃæµÄ´úÂëÖУ¬ÎÒÃÇÓÐÒ»¸öÖ´ÐеÄÉÏÏÂÎÄ£¨myscript.js×ÔÉíµÄ´úÂ룩£¬ÒÔ¼°ËüËùÒýÓõÄ×÷ÓÃÓò¶ÔÏó¡£È«¾Ö¶ÔÏóÀïÃæ»¹º¬Óкܶ಻ͬµÄÊôÐÔ£¬ÔÚÕâÀïÎÒÃǾͺöÂÔµôÁË¡£
ûÓб»Ç¶Ì׵ĺ¯Êý£¨Non-nested functions£©
½ÓÏÂÀ´£¬ÎÒÃÇ¿´Õâ¶Î´úÂë
"use strict"; var foo = 1; var bar = 2;
function myFunc() {
//-- define local-to-function variables
var a = 1;
var b = 2;
var foo = 3;
console.log("inside myFunc");
}
console.log("outside");
//-- and then, call it:
myFunc(); |
µ±myFunc±»¶¨ÒåµÄʱºò£¬myFuncµÄ±êʶ·û£¨identifier£©¾Í±»¼Óµ½Á˵±Ç°µÄ×÷ÓÃÓò¶ÔÏóÖУ¨ÔÚÕâÀï¾ÍÊÇÈ«¾Ö¶ÔÏ󣩣¬²¢ÇÒÕâ¸ö±êʶ·ûËùÒýÓõÄÊÇÒ»¸öº¯Êý¶ÔÏó£¨function
object£©¡£º¯Êý¶ÔÏóÖÐËù°üº¬µÄÊǺ¯ÊýµÄÔ´´úÂëÒÔ¼°ÆäËûµÄÊôÐÔ¡£ÆäÖÐÒ»¸öÎÒÃÇËù¹ØÐĵÄÊôÐÔ¾ÍÊÇÄÚ²¿ÊôÐÔ[[scope]]¡£[[scope]]ËùÖ¸ÏòµÄ¾ÍÊǵ±Ç°µÄ×÷ÓÃÓò¶ÔÏó¡£Ò²¾ÍÊÇÖ¸µÄ¾ÍÊǺ¯ÊýµÄ±êʶ·û±»´´½¨µÄʱºò£¬ÎÒÃÇËùÄܹ»Ö±½Ó·ÃÎʵÄÄǸö×÷ÓÃÓò¶ÔÏó£¨ÔÚÕâÀï¾ÍÊÇÈ«¾Ö¶ÔÏ󣩡£
¡°Ö±½Ó·ÃÎÊ¡±µÄÒâ˼¾ÍÊÇ£¬ÔÚµ±Ç°×÷ÓÃÓòÁ´ÖУ¬¸Ã×÷ÓÃÓò¶ÔÏó´¦ÓÚ×îµ×²ã£¬Ã»ÓÐ×Ó×÷ÓÃÓò¶ÔÏó¡£ |
ËùÒÔ£¬ÔÚconsole.log("outside")±»ÔËÐÐ֮ǰ£¬¶ÔÏóÖ®¼äµÄ¹ØÏµÊÇÈçÏÂͼËùʾ¡£

¶ÔÏóÖ®¼äµÄ¹ØÏµ
ÎÂϰһÏ¡£myFuncËùÒýÓõĺ¯Êý¶ÔÏóÆä±¾Éí²»½ö½öº¬Óк¯ÊýµÄ´úÂ룬²¢ÇÒ»¹º¬ÓÐÖ¸ÏòÆä±»´´½¨µÄʱºòµÄ×÷ÓÃÓò¶ÔÏó¡£ÕâÒ»µã·Ç³£ÖØÒª£¡
µ±myFuncº¯Êý±»µ÷ÓõÄʱºò£¬Ò»¸öеÄ×÷ÓÃÓò¶ÔÏó±»´´½¨ÁË¡£ÐµÄ×÷ÓÃÓò¶ÔÏóÖаüº¬myFuncº¯ÊýËù¶¨ÒåµÄ±¾µØ±äÁ¿£¬ÒÔ¼°Æä²ÎÊý£¨arguments£©¡£Õâ¸öеÄ×÷ÓÃÓò¶ÔÏóµÄ¸¸×÷ÓÃÓò¶ÔÏó¾ÍÊÇÔÚÔËÐÐmyFuncʱÎÒÃÇËùÄÜÖ±½Ó·ÃÎʵÄÄǸö×÷ÓÃÓò¶ÔÏó¡£
ËùÒÔ£¬µ±myFunc±»Ö´ÐеÄʱºò£¬¶ÔÏóÖ®¼äµÄ¹ØÏµÈçÏÂͼËùʾ¡£

¶ÔÏóÖ®¼äµÄ¹ØÏµ£¨º¯ÊýÖ´Ðкó£©
ÏÖÔÚÎÒÃǾÍÓµÓÐÁËÒ»¸ö×÷ÓÃÓòÁ´¡£µ±ÎÒÃÇÊÔͼÔÚmyFuncµ±ÖзÃÎÊijЩ±äÁ¿µÄʱºò£¬JavaScript»áÏÈÔÚÆäÄÜÖ±½Ó·ÃÎʵÄ×÷ÓÃÓò¶ÔÏó£¨ÕâÀï¾ÍÊÇmyFunc()
scope£©µ±ÖвéÕÒÕâ¸öÊôÐÔ¡£Èç¹ûÕÒ²»µ½£¬ÄÇô¾ÍÔÚËüµÄ¸¸×÷ÓÃÓò¶ÔÏóµ±ÖвéÕÒ£¨ÔÚÕâÀï¾ÍÊÇGlobal Object£©¡£Èç¹ûÒ»Ö±ÍùÉÏÕÒ£¬ÕÒµ½Ã»Óи¸×÷ÓÃÓò¶ÔÏóΪֹ»¹Ã»ÓÐÕÒµ½µÄ»°£¬ÄÇô¾Í»áÅ׳öÒ»¸öReferenceError¡£
ÀýÈ磬Èç¹ûÎÒÃÇÔÚmyFuncÖÐÒª·ÃÎÊaÕâ¸ö±äÁ¿£¬ÄÇôÔÚmyFunc scopeµ±ÖоͿÉÒÔÕÒµ½Ëü£¬µÃµ½ÖµÎª1¡£
Èç¹ûÎÒÃdz¢ÊÔ·ÃÎÊfoo£¬ÎÒÃǾͻáÔÚmyFunc() scopeÖеõ½3¡£Ö»ÓÐÔÚmyFunc() scopeÀïÃæÕÒ²»µ½fooµÄʱºò£¬JavaScript²Å»áÍùGlobal
ObjectÈ¥²éÕÒ¡£ËùÒÔ£¬ÕâÀïÎÒÃDz»»á·ÃÎʵ½Global ObjectÀïÃæµÄfoo¡£
Èç¹ûÎÒÃdz¢ÊÔ·ÃÎÊbar£¬ÎÒÃÇÔÚmyFunc() scopeµ±ÖÐÕÒ²»µ½Ëü£¬ÓÚÊǾͻáÔÚGlobal Objectµ±ÖвéÕÒ£¬Òò´Ë²éÕÒµ½2¡£
ºÜÖØÒªµÄÊÇ£¬Ö»ÒªÕâЩ×÷ÓÃÓò¶ÔÏóÒÀÈ»±»ÒýÓã¬ËüÃǾͲ»»á±»À¬»ø»ØÊÕÆ÷£¨garbage collector£©Ïú»Ù£¬ÎÒÃǾÍÒ»Ö±ÄÜ·ÃÎÊËüÃÇ¡£µ±È»£¬µ±ÒýÓÃÒ»¸ö×÷ÓÃÓò¶ÔÏóµÄ×îºóÒ»¸öÒýÓñ»½â³ýµÄʱºò£¬²¢²»´ú±íÀ¬»ø»ØÊÕÆ÷»áÁ¢¿Ì»ØÊÕËü£¬Ö»ÊÇËüÏÖÔÚ¿ÉÒÔ±»»ØÊÕÁË¡£
ËùÒÔ£¬µ±myFunc()·µ»ØµÄʱºò£¬ÔÙҲûÓÐÈËÒýÓÃmyFunc() scopeÁË¡£µ±À¬»ø»ØÊÕ½áÊøºó£¬¶ÔÏóÖ®¼äµÄ¹ØÏµ±ä³É»ØÁ˵÷ÓÃǰµÄ¹ØÏµ¡£

¶ÔÏóÖ®¼äµÄ¹ØÏµ»Ö¸´
½ÓÏÂÀ´£¬ÎªÁËͼ±íÖ±¹ÛÆð¼û£¬ÎÒ½«²»ÔÙ½«º¯Êý¶ÔÏó»³öÀ´¡£µ«ÊÇ£¬ÇëÓÀÔ¶¼Ç×Å£¬º¯Êý¶ÔÏóÀïÃæµÄ[[scope]]ÊôÐÔ£¬±£´æ×Ÿú¯Êý±»¶¨ÒåµÄʱºòËùÄܹ»Ö±½Ó·ÃÎʵÄ×÷ÓÃÓò¶ÔÏó¡£
ǶÌ׵ĺ¯Êý£¨Nested functions£©
ÕýÈçÇ°ÃæËù˵£¬µ±Ò»¸öº¯Êý·µ»Øºó£¬Ã»ÓÐÆäËû¶ÔÏó»á±£´æ¶ÔÆäµÄÒýÓá£ËùÒÔ£¬Ëü¾Í¿ÉÄܱ»À¬»ø»ØÊÕÆ÷»ØÊÕ¡£µ«ÊÇÈç¹ûÎÒÃÇÔÚº¯Êýµ±Öж¨ÒåǶÌ׵ĺ¯Êý²¢ÇÒ·µ»Ø£¬±»µ÷Óú¯ÊýµÄÒ»·½Ëù´æ´¢ÄØ£¿£¨ÈçÏÂÃæµÄ´úÂ룩
function myFunc() { return innerFunc() { // ... } }
var innerFunc = myFunc(); |
ÄãÒѾ֪µÀµÄÊÇ£¬º¯Êý¶ÔÏóÖÐ×ÜÊÇÓÐÒ»¸ö[[scope]]ÊôÐÔ£¬±£´æ×Ÿú¯Êý±»¶¨ÒåµÄʱºòËùÄܹ»Ö±½Ó·ÃÎʵÄ×÷ÓÃÓò¶ÔÏó¡£ËùÒÔ£¬µ±ÎÒÃÇÔÚ¶¨ÒåǶÌ׵ĺ¯ÊýµÄʱºò£¬Õâ¸öǶÌ׵ĺ¯ÊýµÄ[[scope]]¾Í»áÒýÓÃÍâΧº¯Êý£¨Outer
function£©µÄµ±Ç°×÷ÓÃÓò¶ÔÏó¡£
Èç¹ûÎÒÃǽ«Õâ¸öǶÌ׺¯Êý·µ»Ø£¬²¢±»ÁíÍâÒ»¸öµØ·½µÄ±êʶ·ûËùÒýÓõϰ£¬ÄÇôÕâ¸öǶÌ׺¯Êý¼°Æä[[scope]]ËùÒýÓõÄ×÷ÓÃÓò¶ÔÏó¾Í²»»á±»À¬»ø»ØÊÕËùÏú»Ù¡£
"use strict";
function createCounter(initial) {
var counter = initial;
function increment(value) {
counter += value;
}
function get() {
return counter;
}
return {
increment: increment,
get: get
};
}
var myCounter = createCounter(100);
console.log(myCounter.get()); // ·µ»Ø 100
myCounter.increment(5);
console.log(myCounter.get()); // ·µ»Ø 105 |
µ±ÎÒÃǵ÷ÓÃcreateCounter(100)µÄÄÇһ˲¼ä£¬¶ÔÏóÖ®¼äµÄ¹ØÏµÈçÏÂͼ

µ÷ÓÃcreateCounter(100)ʱ¶ÔÏó¼äµÄ¹ØÏµ
×¢ÒâincrementºÍgetº¯Êý¶¼´æÓÐÖ¸ÏòcreateCounter(100)
scopeµÄÒýÓá£Èç¹ûcreateCounter(100)ûÓÐÈκηµ»ØÖµ£¬ÄÇôcreateCounter(100)
scope²»ÔÙ±»ÒýÓã¬ÓÚÊǾͿÉÒÔ±»À¬»ø»ØÊÕ¡£µ«ÊÇÒòΪcreateCounter(100)ʵ¼ÊÉÏÊÇÓзµ»ØÖµµÄ£¬²¢ÇÒ·µ»ØÖµ±»´æ´¢ÔÚÁËmyCounterÖУ¬ËùÒÔ¶ÔÏóÖ®¼äµÄÒýÓùØÏµ±ä³ÉÁËÈçÏÂͼËùʾ

µ÷ÓÃcreateCounter(100)ºó¶ÔÏó¼äµÄ¹ØÏµ
ËùÒÔ£¬createCounter(100)ËäÈ»ÒѾ·µ»ØÁË£¬µ«ÊÇËüµÄ×÷ÓÃÓò¶ÔÏóÒÀÈ»´æÔÚ£¬¿ÉÒÔÇÒ½öÖ»Äܱ»Ç¶Ì׵ĺ¯Êý£¨incrementºÍget£©Ëù·ÃÎÊ¡£
ÈÃÎÒÃÇÊÔ×ÅÔËÐÐmyCounter.get()¡£¸Õ²Å˵¹ý£¬º¯Êý±»µ÷ÓõÄʱºò»á´´½¨Ò»¸öеÄ×÷ÓÃÓò¶ÔÏ󣬲¢ÇÒ¸Ã×÷ÓÃÓò¶ÔÏóµÄ¸¸×÷ÓÃÓò¶ÔÏó»áÊǵ±Ç°¿ÉÒÔÖ±½Ó·ÃÎʵÄ×÷ÓÃÓò¶ÔÏó¡£ËùÒÔ£¬µ±myCounter.get()±»µ÷ÓÃʱµÄһ˲¼ä£¬¶ÔÏóÖ®¼äµÄ¹ØÏµÈçÏ¡£

µ÷ÓÃmyCounter.get()¶ÔÏó¼äµÄ¹ØÏµ
ÔÚmyCounter.get()ÔËÐеĹý³ÌÖУ¬×÷ÓÃÓòÁ´×îµ×²ãµÄ¶ÔÏó¾ÍÊÇget() scope£¬ÕâÊÇÒ»¸ö¿Õ¶ÔÏó¡£ËùÒÔ£¬µ±myCounter.get()·ÃÎÊcounter±äÁ¿Ê±£¬JavaScriptÔÚget()
scopeÖÐÕÒ²»µ½Õâ¸öÊôÐÔ£¬ÓÚÊǾÍÏòÉϵ½createCounter(100) scopeµ±ÖвéÕÒ¡£È»ºó£¬myCounter.get()½«Õâ¸öÖµ·µ»Ø¡£
µ÷ÓÃmyCounter.increment(5)µÄʱºò£¬ÊÂÇé±äµÃ¸üÓÐȤÁË£¬ÒòΪÕâ¸öʱºòº¯Êýµ÷ÓõÄʱºò´«ÈëÁ˲ÎÊý¡£

µ÷ÓÃmyCounter.increment(5)¶ÔÏó¼äµÄ¹ØÏµ
ÕýÈçÄãËù¼û£¬increment(5)µÄµ÷Óô´½¨ÁËÒ»¸öеÄ×÷ÓÃÓò¶ÔÏ󣬲¢ÇÒÆäÖк¬Óд«ÈëµÄ²ÎÊývalue¡£µ±Õâ¸öº¯Êý³¢ÊÔ·ÃÎÊvalueµÄʱºò£¬JavaScriptÁ¢¿Ì¾ÍÄÜÔÚµ±Ç°µÄ×÷ÓÃÓò¶ÔÏóÕÒµ½Ëü¡£È»¶ø£¬Õâ¸öº¯ÊýÊÔͼ·ÃÎÊcounterµÄʱºò£¬JavaScriptÎÞ·¨ÔÚµ±Ç°µÄ×÷ÓÃÓò¶ÔÏóÕÒµ½Ëü£¬ÓÚÊǾͻáÔÚÆä¸¸×÷ÓÃÓòcreateCounter(100)
scopeÖвéÕÒ¡£
ÎÒÃÇ¿ÉÒÔ×¢Òâµ½£¬ÔÚcreateCounterº¯ÊýÖ®Í⣬³ýÁ˱»·µ»ØµÄgetºÍincrementÁ½¸ö·½·¨£¬Ã»ÓÐÆäËûµÄµØ·½¿ÉÒÔ·ÃÎʵ½valueÕâ¸ö±äÁ¿ÁË¡£Õâ¾ÍÊÇÓñհüʵÏÖ¡°Ë½ÓбäÁ¿¡±µÄ·½·¨¡£
ÎÒÃÇ×¢Òâµ½initial±äÁ¿Ò²±»´æ´¢ÔÚcreateCounter()Ëù´´½¨µÄ×÷ÓÃÓò¶ÔÏóÖУ¬¾¡¹ÜËüûÓб»Óõ½¡£ËùÒÔ£¬ÎÒÃÇʵ¼ÊÉÏ¿ÉÒÔÈ¥µôvar
counter = initial;£¬½«initial¸ÄÃûΪcounter¡£µ«ÊÇΪÁË´úÂëµÄ¿É¶ÁÐÔÆð¼û£¬ÎÒÃDZ£ÁôÔÓеĴúÂë²»×ö±ä»¯¡£
ÐèҪעÒâµÄÊÇ×÷ÓÃÓòÁ´ÊDz»»á±»¸´ÖƵġ£Ã¿´Îº¯Êýµ÷ÓÃÖ»»áÍù×÷ÓÃÓòÁ´ÏÂÃæÐÂÔöÒ»¸ö×÷ÓÃÓò¶ÔÏó¡£ËùÒÔ£¬Èç¹ûÔÚº¯Êýµ÷ÓõĹý³Ìµ±ÖжÔ×÷ÓÃÓòÁ´ÖеÄÈκÎÒ»¸ö×÷ÓÃÓò¶ÔÏóµÄ±äÁ¿½øÐÐÐ޸ĵϰ£¬ÄÇôͬʱ×÷ÓÃÓòÁ´ÖÐÒ²ÓµÓиÃ×÷ÓÃÓò¶ÔÏóµÄº¯Êý¶ÔÏóÒ²ÊÇÄܹ»·ÃÎʵ½Õâ¸ö±ä»¯ºóµÄ±äÁ¿µÄ¡£
ÕâÒ²¾ÍÊÇΪʲôÏÂÃæÕâ¸ö´ó¼Ò¶¼ºÜÊìϤµÄÀý×ӻ᲻Äܲú³öÎÒÃÇÏëÒªµÄ½á¹û¡£
"use strict";
var elems = document.getElementsByClassName("myClass"),
i;
for (i = 0; i < elems.length; i++) {
elems[i].addEventListener("click", function
() {
this.innerHTML = i;
});
} |
ÔÚÉÏÃæµÄÑ»·Öд´½¨Á˶à¸öº¯Êý¶ÔÏó£¬ËùÓеĺ¯Êý¶ÔÏóµÄ[[scope]]¶¼±£´æ×ŶԵ±Ç°×÷ÓÃÓò¶ÔÏóµÄÒýÓ᣶ø±äÁ¿iÕýºÃ¾ÍÔÚµ±Ç°×÷ÓÃÓòÁ´ÖУ¬ËùÒÔÑ»·Ã¿´Î¶ÔiµÄÐ޸쬶ÔÓÚÿ¸öº¯Êý¶ÔÏó¶¼ÊÇÄܹ»¿´µ½µÄ¡£
¡°¿´ÆðÀ´Ò»ÑùµÄ¡±º¯Êý£¬²»Ò»ÑùµÄ×÷ÓÃÓò¶ÔÏó
ÏÖÔÚÎÒÃÇÀ´¿´Ò»¸ö¸üÓÐȤµÄÀý×Ó¡£
"use strict";
function createCounter(initial) {
// ...
}
var myCounter1 = createCounter(100);
var myCounter2 = createCounter(200); |
µ±myCounter1ºÍmyCounter2±»´´½¨ºó£¬¶ÔÏóÖ®¼äµÄ¹ØÏµÎª

myCounter1ºÍmyCounter2±»´´½¨ºó£¬¶ÔÏóÖ®¼äµÄ¹ØÏµ
ÔÚÉÏÃæµÄÀý×ÓÖУ¬myCounter1.incrementºÍmyCounter2.incrementµÄº¯Êý¶ÔÏóÓµÓÐ×ÅÒ»ÑùµÄ´úÂëÒÔ¼°Ò»ÑùµÄÊôÐÔÖµ£¨name£¬lengthµÈµÈ£©£¬µ«ÊÇËüÃǵÄ[[scope]]Ö¸ÏòµÄÊDz»Ò»ÑùµÄ×÷ÓÃÓò¶ÔÏó¡£
Õâ²ÅÓÐÁËÏÂÃæµÄ½á¹û
var a, b; a = myCounter1.get(); // a µÈÓÚ 100 b = myCounter2.get(); // b µÈÓÚ 200
myCounter1.increment(1);
myCounter1.increment(2);
myCounter2.increment(5);
a = myCounter1.get(); // a µÈÓÚ 103
b = myCounter2.get(); // b µÈÓÚ 205 |
×÷ÓÃÓòÁ´ºÍthis
thisµÄÖµ²»»á±»±£´æÔÚ×÷ÓÃÓòÁ´ÖУ¬thisµÄֵȡ¾öÓÚº¯Êý±»µ÷ÓõÄʱºòµÄÇé¾°¡£
ÒëÕß×¢£º¶ÔÕⲿ·Ö£¬ÒëÕß×Ô¼ºÔø¾Ð´¹ýһƪ¸ü¼ÓÏ꾡µÄÎÄÕ£¬Çë²Î¿¼¡¶ÓÃ×ÔÈ»ÓïÑԵĽǶÈÀí½âJavaScriptÖеÄthis¹Ø¼ü×Ö¡·¡£ÔÎĵÄÕâÒ»²¿·ÖÒÔ¼°¡°thisÔÚǶÌ׵ĺ¯ÊýÖеÄʹÓá±ÒëÕ߱㲻ÔÙ·Òë¡£
×ܽá
ÈÃÎÒÃÇÀ´»ØÏëÎÒÃÇÔÚ±¾ÎÄ¿ªÍ·Ìáµ½µÄһЩÎÊÌâ¡£
1.ʲôÊDZհü£¿±Õ°ü¾ÍÊÇͬʱº¬ÓжԺ¯Êý¶ÔÏóÒÔ¼°×÷ÓÃÓò¶ÔÏóÒýÓõÄ×îÏ롣ʵ¼ÊÉÏ£¬ËùÓÐJavaScript¶ÔÏó¶¼ÊDZհü¡£
2.±Õ°üÊÇʲôʱºò±»´´½¨µÄ£¿ÒòΪËùÓÐJavaScript¶ÔÏó¶¼ÊDZհü£¬Òò´Ë£¬µ±Ä㶨ÒåÒ»¸öº¯ÊýµÄʱºò£¬Äã¾Í¶¨ÒåÁËÒ»¸ö±Õ°ü¡£
3.±Õ°üÊÇʲôʱºò±»Ïú»ÙµÄ£¿µ±Ëü²»±»ÈÎºÎÆäËûµÄ¶ÔÏóÒýÓõÄʱºò¡£
רÓÐÃû´Ê·Òë±í
±¾ÎIJÉÓÃÏÂÃæµÄרÓÐÃû´Ê·Òë±í£¬ÈçÓиüºÃµÄ·ÒëÇë¸æÖª£¬ÓÈÆäÊǼÓ*µÄ·Òë
1.*È«¾Ö»·¾³ÖÐÔËÐеĴúÂ룺top-level code
2.²ÎÊý£ºarguments
3.×÷ÓÃÓò¶ÔÏó£ºScope object
4.×÷ÓÃÓòÁ´£ºScope Chain
5.Õ»£ºstack
6.ÔÐͼ̳Уºprototypal inheritance
7.ÔÐÍÁ´£ºprototype chain
8.È«¾Ö¶ÔÏó£ºGlobal Object
9.±êʶ·û£ºidentifier
10.À¬»ø»ØÊÕÆ÷£ºgarbage collector
|