±Õ°ü¾ÍÊÇÖ¸ÓÐȨ·ÃÎÊÁíÒ»¸öº¯Êý×÷ÓÃÓòÖеıäÁ¿µÄº¯Êý¡£MDN ÉÏÃæÕâô˵£º±Õ°üÊÇÒ»ÖÖÌØÊâµÄ¶ÔÏó¡£ËüÓÉÁ½²¿·Ö¹¹³É£ºº¯Êý£¬ÒÔ¼°´´½¨¸Ãº¯ÊýµÄ»·¾³¡£»·¾³Óɱհü´´½¨Ê±ÔÚ×÷ÓÃÓòÖеÄÈκξֲ¿±äÁ¿×é³É¡£´´½¨±Õ°ü×î³£¼û·½Ê½£¬¾ÍÊÇÔÚÒ»¸öº¯ÊýÄÚ²¿´´½¨ÁíÒ»¸öº¯Êý¡£

ʲôÊDZհü(Closure)
¼òµ¥½²£¬±Õ°ü¾ÍÊÇÖ¸ÓÐȨ·ÃÎÊÁíÒ»¸öº¯Êý×÷ÓÃÓòÖеıäÁ¿µÄº¯Êý¡£
MDN ÉÏÃæÕâô˵£º±Õ°üÊÇÒ»ÖÖÌØÊâµÄ¶ÔÏó¡£ËüÓÉÁ½²¿·Ö¹¹³É£ºº¯Êý£¬ÒÔ¼°´´½¨¸Ãº¯ÊýµÄ»·¾³¡£»·¾³Óɱհü´´½¨Ê±ÔÚ×÷ÓÃÓòÖеÄÈκξֲ¿±äÁ¿×é³É¡£
µ«ÊÇ£¬ÍøÉÏÕÒÁ˺öà×ÊÁÏ£¬ËüÃǶԱհüµÄ¶¨ÒåÒ²¸÷Óи÷Ñù£¬¸ãµÃÎÒÒ²²»ÖªµÀÔõôȥ¶¨Òå±Õ°üÁË£¬ËùÒԸɴ಻ȥ¶¨ÒåÁË£¬Òâ»á°É¡£
µÀ¿ÉµÀ£¬·Ç³£µÀ;Ãû¿ÉÃû£¬·Ç³£Ãû¡£
²úÉúÒ»¸ö±Õ°ü ´´½¨±Õ°ü×î³£¼û·½Ê½£¬¾ÍÊÇÔÚÒ»¸öº¯ÊýÄÚ²¿´´½¨ÁíÒ»¸öº¯Êý¡£ÏÂÃæÀý×ÓÖеÄ
closure ¾ÍÊÇÒ»¸ö±Õ°ü£º
function func(){ var a = 1,b = 2; function closure(){ return a+b; } return closure; } |
±Õ°üµÄ×÷ÓÃÓòÁ´°üº¬×ÅËü×Ô¼ºµÄ×÷ÓÃÓò£¬ÒÔ¼°°üº¬ËüµÄº¯ÊýµÄ×÷ÓÃÓòºÍÈ«¾Ö×÷ÓÃÓò¡£
±Õ°üµÄ×¢ÒâÊÂÏî
ͨ³££¬º¯ÊýµÄ×÷ÓÃÓò¼°ÆäËùÓбäÁ¿¶¼»áÔÚº¯ÊýÖ´ÐнáÊøºó±»Ïú»Ù¡£µ«ÊÇ£¬ÔÚ´´½¨ÁËÒ»¸ö±Õ°üÒÔºó£¬Õâ¸öº¯ÊýµÄ×÷ÓÃÓò¾Í»áÒ»Ö±±£´æµ½±Õ°ü²»´æÔÚΪֹ
function makeAdder(x) { return function(y) { return x + y; }; } var add5 = makeAdder(5); var add10 = makeAdder(10); console.log(add5(2)); // 7 console.log(add10(2)); // 12 // ÊͷŶԱհüµÄÒýÓà add5 = null; add10 = null; |
add5 ºÍ add10 ¶¼ÊDZհü¡£ËüÃǹ²ÏíÏàͬµÄº¯Êý¶¨Ò壬µ«ÊDZ£´æÁ˲»Í¬µÄ»·¾³¡£ÔÚ
add5 µÄ»·¾³ÖУ¬x Ϊ 5¡£¶øÔÚ add10 ÖУ¬x ÔòΪ 10¡£×îºóͨ¹ý null ÊÍ·ÅÁË add5
ºÍ add10 ¶Ô±Õ°üµÄÒýÓá£
ÔÚjavascriptÖУ¬Èç¹ûÒ»¸ö¶ÔÏó²»ÔÙ±»ÒýÓã¬ÄÇôÕâ¸ö¶ÔÏó¾Í»á±»À¬»ø»ØÊÕ»úÖÆ»ØÊÕ;
Èç¹ûÁ½¸ö¶ÔÏó»¥ÏàÒýÓ㬶ø²»ÔÙ±»µÚ3ÕßËùÒýÓã¬ÄÇôÕâÁ½¸ö»¥ÏàÒýÓõĶÔÏóÒ²»á±»»ØÊÕ¡£
±Õ°üÖ»ÄÜÈ¡µÃ°üº¬º¯ÊýÖÐÈκαäÁ¿µÄ×îºóÒ»¸öÖµ£¬ÕâÊÇÒòΪ±Õ°üËù±£´æµÄÊÇÕû¸ö±äÁ¿¶ÔÏ󣬶ø²»ÊÇij¸öÌØÊâµÄ±äÁ¿¡£
function test(){ var arr = []; for(var i = 0;i < 10;i++){ arr[i] = function(){ return i; }; } for(var a = 0;a < 10;a++){ console.log(arr[a]()); } } test(); // Á¬Ðø´òÓ¡ 10 ¸ö 10 |
¶ÔÓÚÉÏÃæµÄÇé¿ö£¬Èç¹ûÎÒÃǸıä´úÂëÈçÏÂ
function test(){ var arr = []; for(let i = 0;i < 10;i++){ // ½öÔÚÕâÀï×÷³öÁ˸͝ arr[i] = function(){ return i; }; } for(var a = 0;a < 10;a++){ console.log(arr[a]()); } } test(); // ´òÓ¡ 0 µ½ 9 |
¶ÔÓÚÉÏÃæÁ½ÖÖ´úÂëµÄ½âÊÍ£¬Çë¿´ÎÒÔÚ segmentfault ÉÏÃæµÄÌáÎÊ£ºÁ´½Ó
±Õ°üÖÐµÄ this ¶ÔÏó
var name = "The Window"; var obj = { name: "My Object", getName: function(){ return function(){ return this.name; }; } }; console.log(obj.getName()()); // The Window |
obj.getName()()ʵ¼ÊÉÏÊÇÔÚÈ«¾Ö×÷ÓÃÓòÖе÷ÓÃÁËÄäÃûº¯Êý£¬thisÖ¸ÏòÁËwindow¡£ÕâÀïÒªÀí½âº¯ÊýÃûÓ뺯Êý¹¦ÄÜ(»òÕ߳ƺ¯ÊýÖµ)ÊǷָµÄ£¬²»ÒªÈÏΪº¯ÊýÔÚÄÄÀÆäÄÚ²¿µÄthis¾ÍÖ¸ÏòÄÄÀï¡£ÄäÃûº¯ÊýµÄÖ´Ðл·¾³¾ßÓÐÈ«¾ÖÐÔ£¬Òò´ËÆä
this ¶ÔÏóͨ³£Ö¸Ïò window¡£
var name = "The Window"; var obj = { name: "My Object", getName: function(){ var that = this; return function(){ return that.name; }; } }; console.log(obj.getName()()); // My Object |
±Õ°üµÄÓ¦ÓÃ
Ó¦ÓñհüµÄÖ÷Òª³¡ºÏÊÇ£ºÉè¼ÆË½Óеķ½·¨ºÍ±äÁ¿¡£ ÈκÎÔÚº¯ÊýÖж¨ÒåµÄ±äÁ¿£¬¶¼¿ÉÒÔÈÏΪÊÇ˽ÓбäÁ¿£¬ÒòΪ²»ÄÜÔÚº¯ÊýÍⲿ·ÃÎÊÕâЩ±äÁ¿¡£Ë½ÓбäÁ¿°üÀ¨º¯ÊýµÄ²ÎÊý¡¢¾Ö²¿±äÁ¿ºÍº¯ÊýÄÚ¶¨ÒåµÄÆäËûº¯Êý¡£
°ÑÓÐȨ·ÃÎÊ˽ÓбäÁ¿µÄ¹«Óз½·¨³ÆÎªÌØÈ¨·½·¨(privileged method)
function Animal(){ // ˽ÓбäÁ¿ var series = "²¸È鶯Îï"; function run(){ console.log("Run!!!"); } // ÌØÈ¨·½·¨ this.getSeries = function(){ return series; }; } |
Ä£¿éģʽ(The Module Pattern)£ºÎªµ¥Àý´´½¨Ë½ÓбäÁ¿ºÍ·½·¨¡£
µ¥Àý(singleton)£ºÖ¸µÄÊÇÖ»ÓÐÒ»¸öʵÀýµÄ¶ÔÏó¡£JavaScript Ò»°ãÒÔ¶ÔÏó×ÖÃæÁ¿µÄ·½Ê½À´´´½¨Ò»¸öµ¥Àý¶ÔÏó¡£
var singleton = { name: "percy", speak:function(){ console.log("speaking!!!"); }, getName: function(){ return this.name; } }; |
ÉÏÃæÊÇÆÕͨģʽ´´½¨µÄµ¥Àý£¬ÏÂÃæÊ¹ÓÃÄ£¿éģʽ´´½¨µ¥Àý
var singleton = (function(){ // ˽ÓбäÁ¿ var age = 22; var speak = function(){ console.log("speaking!!!"); }; // ÌØÈ¨£¨»ò¹«ÓУ©ÊôÐԺͷ½·¨ return { name: "percy", getAge: function(){ return age; } }; })(); |
ÄäÃûº¯Êý×î´óµÄÓÃ;ÊÇ´´½¨±Õ°ü£¬²¢ÇÒ»¹¿ÉÒÔ¹¹½¨ÃüÃû¿Õ¼ä£¬ÒÔ¼õÉÙÈ«¾Ö±äÁ¿µÄʹÓᣴӶøÊ¹ÓñհüÄ£¿é»¯´úÂ룬¼õÉÙÈ«¾Ö±äÁ¿µÄÎÛȾ¡£
var objEvent = objEvent || {}; (function(){ var addEvent = function(){ // some code }; function removeEvent(){ // some code } objEvent.addEvent = addEvent; objEvent.removeEvent = removeEvent; })(); |
ÔÚÕâ¶Î´úÂëÖк¯Êý addEvent ºÍ removeEvent ¶¼ÊǾֲ¿±äÁ¿£¬µ«ÎÒÃÇ¿ÉÒÔͨ¹ýÈ«¾Ö±äÁ¿
objEvent ʹÓÃËü£¬Õâ¾Í´ó´ó¼õÉÙÁËÈ«¾Ö±äÁ¿µÄʹÓã¬ÔöÇ¿ÁËÍøÒ³µÄ°²È«ÐÔ¡£ Ò»¸ö±Õ°ü¼ÆÊýÆ÷
var countNumber = (function(){ var num = 0; return function(){ return ++num; }; })(); |
±Õ°üµÄȱÏÝ
±Õ°üµÄȱµã¾ÍÊdz£×¤ÄÚ´æ»áÔö´óÄÚ´æÊ¹ÓÃÁ¿£¬²¢ÇÒʹÓò»µ±ºÜÈÝÒ×Ôì³ÉÄÚ´æÐ¹Â¶¡£
Èç¹û²»ÊÇÒòÎªÄ³Ð©ÌØÊâÈÎÎñ¶øÐèÒª±Õ°ü£¬ÔÚûÓбØÒªµÄÇé¿öÏ£¬ÔÚÆäËüº¯ÊýÖд´½¨º¯ÊýÊDz»Ã÷Öǵģ¬ÒòΪ±Õ°ü¶Ô½Å±¾ÐÔÄܾßÓиºÃæÓ°Ï죬°üÀ¨´¦ÀíËٶȺÍÄÚ´æÏûºÄ¡£
×îºóÔÙÀ´Ò»Ð©ÓйرհüµÄÃæÊÔ? ÏÂÃæ´úÂëÖУ¬±ê¼Ç ? µÄµØ·½Êä³ö·Ö±ðÊÇʲô?
function fun(n,o){ console.log(o); return { fun: function(m){ return fun(m,n); } }; } var a = fun(0); // ? a.fun(1); // ? a.fun(2); // ? a.fun(3); // ? var b = fun(0).fun(1).fun(2).fun(3); // ? var c = fun(0).fun(1); // ? c.fun(2); // ? c.fun(3); // ? undefined 0 0 0 undefined, 0, 1, 2 undefined, 0
1 1
|
|