Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
JavaScript ±Õ°üµÄµ×²ãÔËÐлúÖÆ
 
À´Ô´£ºÂëÅ©Íø ·¢²¼ÓÚ2016-10-12
  3237  次浏览      27
 

ÎÒÑо¿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

   
3237 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕ Ïà¹ØÎĵµ Ïà¹Ø¿Î³Ì



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Àí½âJavascript
·ÇµäÐÍajaxʵ¼ù
³¹µ×µÄAjax
javascript ʹÓÃCookies
ʹÓà jQuery ¼ò»¯ Ajax ¿ª·¢

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

ijº½¿Õ¹«Ë¾IT²¿ JavaScriptʵ¼ù
ijµçÊÓÈí¼þ HTML5ºÍJavaScript
Öк½ÐÅ JavaScript¸ß¼¶Ó¦Óÿª·¢
´óÇìÓÍÌï web½çÃæAjax¿ª·¢¼¼Êõ
ºÍÀûʱ ʹÓÃAJAX½øÐÐWEBÓ¦Óÿª·¢