場景一:采用函數引用方式的setTimeout調用
閉包的一個通常的用法是為一個在某一函數執行前先執行的函數提供參數。例如,在web環境中,一個函數作為setTimeout函數調用的第一個參數,是一種很常見的應用。
setTimeout將要執行的函數(或者一段javascript代碼,但這不是我們要討論的情況)作為它的第一個參數,下一個參數是需要延遲執行的時間。如果一段代碼想通過setTimeout來調用,那么它需要傳遞一個函數對象的引用來作為第一個參數。延遲的毫秒數作為第二個參數,但這個函數對象的引用無法為將要被延遲執行的對象提供參數。
但是,可以調用另一個函數來返回一個內部函數的調用,將那個內部函數對象的引用傳遞給setTimeout函數。內部函數執行時需要的參數,在調用外部函數時傳遞給它。setTimeout在執行內部函數時無需傳遞參數,因為內部函數仍然能夠訪問外部函數調用時提供的參數:
function callLater(paramA, paramB, paramC) { /*使用函數表達式創建並放回一個匿名內部函數的引用*/ return (function () { /* 這個內部函數將被setTimeout函數執行; 並且當它被執行時, 它能夠訪問並操作外部函數傳遞過來的參數 */ paramA[paramB] = paramC; }); } /* 調用這個函數將在它的執行上下文中創建,並最終返回內部函數對象的引用 傳遞過來的參數,內部函數在最終被執行時,將使用外部函數的參數 返回的引用被賦予了一個變量 */ var funcRef = callLater(elStyle, "display", "none"); /*調用setTimeout函數,傳遞內部函數的引用作為第一個參數*/ hideMenu = setTimeout(funcRef, 500);
場景一.1:
var foo = ( function() { var secret = 'secret'; // “閉包”內的函數可以訪問 secret 變量,而 secret 變量對於外部卻是隱藏的 return { get_secret: function () { // 通過定義的接口來訪問 secret return secret; }, new_secret: function ( new_secret ) { // 通過定義的接口來修改 secret secret = new_secret; } }; } () ); foo.get_secret (); // 得到 'secret' foo.secret; // Type error,訪問不能 foo.new_secret ('a new secret'); // 通過函數接口,我們訪問並修改了 secret 變量 foo.get_secret (); // 得到 'a new secret'
原網址鏈接:http://blog.csdn.net/yanghua_kobe/article/details/6780181