DIV CSS 佈局教程網

JS閉包經典例題
編輯:JavaScript基礎知識     

上一篇文章談論了閉包的概念和一些應用,並給出一個例題,這篇文章就此道例題進行討論。

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);

問:三行a,b,c的輸出分別是什麼?

首先來看第一行

  • var a = fun(0);
    等同於fun(0, undefined),因為未傳遞第二參數,所以打印undefined
  • a.fun(1);
    因為閉包的存在,所以n依然在內存中存在,所以此式等同於fun(0, undefined).fun(1)
    所以a.fun(1)返回的就是fun(m, n)
    m是傳進去的參數1,n是內存中依然存在的0,所以實際返回的是fun(1, 0);因此打印的值為0,;
    後面兩步就同理了;
    注意:這一步弄明白,這道題基本就明白了。所以一定要注意。第一行的後面兩步就換了一下參數。第二行就相當於一直迭代,第三行就是稍加變化,重點在這一步。
  • a.fun(2);
    返回fun(2, 0),依然打印0
  • a.fun(3);
    返回fun(3, 0),依然打印0
  • 所以第二行打印值為undefined,0,0,0

第二行

  • var b = fun(0)
    從這來看,和第一行暫時一樣,打印undefined
  • .fun(1)
    此時和第一行第二步也是一樣,返回fun(1, 0), 打印0
  • .fun(2)
    這一步其實已經變為fun(1, 0).fun(2),弄明白了上面,你一定知道這一步應該返回的是fun(2, 1);因為此時在內存中的n是1;所以打印值為1;
  • .fun(3)
    和上一步道理相同,n變為2,即fun(3, 2);打印2
  • 所以第二行打印值為undefined,0,1,2

第三行就是一二行的結合,如果弄懂了上面兩行,第三行不過是一個驗證的過程。也就不在多說。
輸出為 undefined,0,1,1

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved