2012年8月15日星期三

【深入xx】四

【深入xx】四

深入理解JavaScript系列(4):立即调用的函数表达式
http://www.cnblogs.com/TomXu/archive/2011/12/31/2289423.html

<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="utf-8" />    <title></title></head><body>    <script type="text/javascript">        function makeCounter() {            var i = 0;            return function () {                console.log(++i);            };        }        var counter = makeCounter();        counter();        counter();        var counter2 = makeCounter();        counter2();        counter2();        // 引用错误        alert(i);    </script></body></html>
<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="utf-8" />    <title></title></head><body>    <script type="text/javascript">        // function statement requires a name        //function () {alert(1);}();        // 解析成表达式了而不是声明了        var f = function () {alert(2);}();    </script></body></html>
<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="utf-8" />    <title></title></head><body>    <a href="">1</a>    <a href="">2</a>    <a href="">3</a>    <script type="text/javascript">        var elems = document.getElementsByTagName('a');        for (var i = 0, len = elems.length; i < len; i++) {            console.log(i);            // 0 1 2都绑定了事件            // i加到3判断不成立了,但i是3            elems[i].addEventListener('click', function (e) {                e.preventDefault();                alert('I am link #' + i);            }, 'false');            // 相当于            /*elems[0].addEventListener('click', function (e) {                e.preventDefault();                alert('I am link #' + i);            }, 'false');            elems[1].addEventListener('click', function (e) {                e.preventDefault();                alert('I am link #' + i);            }, 'false');            elems[2].addEventListener('click', function (e) {                e.preventDefault();                alert('I am link #' + i);            }, 'false');*/        }    </script></body></html>
<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="utf-8" />    <title></title></head><body>    <a href="">0</a>    <a href="">1</a>    <a href="">2</a>    <script type="text/javascript">        var elems = document.getElementsByTagName('a');        // 但闭包内部的lockedInIndex值是没有改变,因为他已经执行完毕了        for (var i = 0, len = elems.length; i < len; i++) {            console.log(i);            (function (lockedInIndex) {                elems[i].addEventListener('click', function (e) {                    e.preventDefault();                    alert('I am link #' + 'i: ' + i + 'lockedInIndex' + lockedInIndex);                }, 'false');            }(i));        }    </script></body></html>
<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="utf-8" />    <title></title></head><body>    <a href="">0</a>    <a href="">1</a>    <a href="">2</a>    <script type="text/javascript">        var elems = document.getElementsByTagName('a');        for (var i = 0, len = elems.length; i < len; i++) {            elems[i].addEventListener('click', (function (i) {                return function (e) {                    e.preventDefault();                    alert('I am link #' + i);                };            })(i), 'false');        }    </script></body></html>

TAG: