javascript 引數傳入小筆記

引數計算

利用函數的部分應用來決定引數順序輸出結果

//建立引數陣列
    function array(a, n) { return Array.prototype.slice.call(a, n || 0) };

    function partialLeft(f/*,...*/) {
        //第一階段 partialLeft(f,2)
        //arguments = [[x,y,z],2]
        var args = arguments;//將引數暫存 args

        return function () {
            //第二階段 (3,4)
            //args = [[x,y,z],2]
            //arguments = [3,4]
            var a = array(args, 1);//[[x,y,z],2].slice(1)=>[2]
            a = a.concat(array(arguments));//[2].concat([3,4].slice(0))=>[2,3,4]

            return f.apply(this, a);//f(2,3,4)
        }
    }

    function partialRight(f/*,...*/) {
        //第一階段 partialRight(f,2)
        //arguments = [[x,y,z],2]
        var args = arguments;//暫存在 args

        return function () {
            //第二階段 (3,4)
            //args = [[x,y,z],2]
            //argumnets = [3,4]
            var a = array(arguments); //[3,4].slice(0) =>[3,4]
            a = a.concat(array(args, 1));//[3,4].concat([x,y,z].slice(1))=>[3,4,2]
            return f.apply(this, a);//f(3,4,2)
        }
    }

    //自訂函數規則
    var f = function (x, y, z) {
        return x * (y - z);
    }

    //結果測試
    partialLeft(f, 2)(3, 4);//2*(3-4) = -2
    partialRight(f, 2)(3, 4);//3*(4-2) = -6