js學習六-閉包

EpisodeOne發表於2016-05-17

閉包:
def:函式內部定義的子函式用到了父函式內部的變數,形成的特定作用域
功能:
1.儲存函式的執行狀態
code:
‘a1c2f3g4’中的數字依次用[‘b’.’d’,’e’,’h’]替換
//count變數會儲存在閉包作用域內,表示func被呼叫的次數

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Closure1</title>
</head>
<body>
    <script type="text/javascript">
        var arr = ['b','d','e','h'];
        var str = 'a1c2f3g4';

        var func = (function() {
            var count = 0;
            return function() {
                return arr[count++];
            }
        })();

        str = str.replace(/\d/g, func);
        console.log(str);
        // abcdfegh

        //不使用閉包
        function sum(i, j) {
            var add = function (i, j) {
                return i+j;
            }
            return add(i, j);
        }
        var startTime = new Date();
        for(var i=0;i<1000000;i++) {
            sum(1, 1);
        }
        var endTime = new Date();
        console.log(endTime-startTime)
        //49

        //使用閉包
        var sum = (function () {
            var add = function(i, j){
                return i+j;
            }
            return function(i,j){
                add(i,j);
            }
        })()
        var startTime = new Date();
        for(var i=0;i<1000000;i++) {
            sum(1, 1);
        }
        var endTime = new Date();
        console.log(endTime-startTime)
        //4
    </script>
</body>
</html>

2.封裝
私有變數,不被外部呼叫
3.效能優化
由於作用域的範圍,節約了執行時間

first-class function(函式即變數):
功能如下:
1.函式可以當做引數
非同步回撥函式例如ajax
2.函式作為返回值
①Function.prototype.bind()此方法與function.apply(obj,param)方法類似
是指先繫結不作操作,如若執行則需要Function.prototype.bind()()
返回的是函式引用不是函式值
code:

var move = function (x,y) {
            this.x += x;
            this.y += y;
        };
        var p = {x:1,y:1};
        var pmove = move.bind(p,2,2);
        console.log(p)
        // Object {x: 1, y: 1}
        pmove();
        console.log(p)
        // Object {x: 3, y: 3}

②curry柯里化

相關文章