<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 簡介 當函數可以記住并訪問所在的詞法作用域時,就產生了閉包,即使函數是在當前詞法作用域之外執行。 <br> 如果將函數(訪問它們各自的詞法作用域)當作第一級的值類型并到處傳遞,你就會看到閉包在這些函數中的應用。在定時器、事件監聽器、Ajax 請求、跨窗口通信、Web Workers 或者任何其他的異步(或者同步)任務中,只要使用了回調函數,實際上就是在使用閉包! <br> 閉包的例子: ~~~ function fn1() { var name = 'iceman'; function fn2() { console.log(name); } return fn2; } var fn3 = fn1(); fn3(); ~~~ 這樣就清晰地展示了閉包: * fn2的詞法作用域能訪問fn1的作用域 * 將fn2當做一個值返回 * fn1執行后,將fn2的引用賦值給fn3 * 執行fn3,輸出了變量name <br> 我們知道通過引用的關系,fn3就是fn2函數本身。執行fn3能正常輸出name,這不就是fn2能記住并訪問它所在的詞法作用域,而且fn2函數的運行還是在當前詞法作用域之外了。 <br> 正常來說,當fn1函數執行完畢之后,其作用域是會被銷毀的,然后垃圾回收器會釋放那段內存空間。而閉包卻很神奇的將fn1的作用域存活了下來,**fn2依然持有該作用域的引用,這個引用就是閉包**。 <br> 注意:對函數值的傳遞可以通過其他的方式,并不一定值有返回該函數這一條路,比如可以用回調函數: ~~~ function fn1() { var name = 'iceman'; function fn2() { console.log(name); } fn3(fn2); } function fn3(fn) { fn(); } fn1(); ~~~ <br> 總結:**某個函數在定義時的詞法作用域之外的地方被調用,閉包可以使該函數極限訪問定義時的詞法作用域**。 <br> <br> # 閉包的應用 ## 實現模塊化 ~~~ var MyModules = (function Manager() { var modules = {}; function define(name, deps, impl) { for (var i = 0; i < deps.length; i++) { deps[i] = modules[deps[i]]; } modules[name] = impl.apply(impl, deps); } function get(name) { return modules[name]; } return { define: define, get: get }; })(); ~~~ <br> 調用 ~~~ MyModules.define("bar", [], function () { function hello(who) { return "Let me introduce: " + who; } return { hello: hello }; }); MyModules.define("foo", ["bar"], function (bar) { var hungry = "hippo"; function awesome() { console.log(bar.hello(hungry).toUpperCase()); } return { awesome: awesome }; }); var bar = MyModules.get("bar"); var foo = MyModules.get("foo"); console.log( bar.hello("hippo") ); // Let me introduce: hippo foo.awesome(); // LET ME INTRODUCE: HIPPO ~~~ <br> ## 循環調用 ~~~ for (var i=1; i<=5; i++) { (function() { var j = i; setTimeout( function timer() { console.log( j ); }, j*1000 ); })(); } ~~~ 改進 ~~~ for (var i=1; i<=5; i++) { (function(j) { setTimeout( function timer() { console.log( j ); }, j*1000 ); })( i ); } ~~~ <br> <br> # 參考資料 你不知道的JavaScript(上卷)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看