2014-12-05       个评论
我要投稿

var concat3Words = function (a, b, c) {
return a+b+c;
};

var concat3WordsCurrying = function(a) {
return function (b) {
return function (c) {
return a+b+c;
};
};
};
console.log(concat3Words("foo ","bar ","baza"));            // foo bar baza
console.log(concat3WordsCurrying("foo "));                  // [Function]
console.log(concat3WordsCurrying("foo ")("bar ")("baza"));  // foo bar baza

return items.reduce(function(a,b){
return a+b
});
};

var add = function (items,multi) {
return items.map(function (item) {
return item*multi;
}).reduce(function (a, b) {
return a + b
});
};

var adder = function () {
var _args = [];
return function () {
if (arguments.length === 0) {
return _args.reduce(function (a, b) {
return a + b;
});
}
[].push.apply(_args, [].slice.call(arguments));
return arguments.callee;
}
};

console.log(sum);     // Function

sum(100,200)(300);    // 调用形式灵活，一次调用可输入一个或者多个参数，并且支持链式调用
sum(400);
console.log(sum());   // 1000 （加总计算）

var currying = function (fn) {
var _args = [];
return function () {
if (arguments.length === 0) {
return fn.apply(this, _args);
}
Array.prototype.push.apply(_args, [].slice.call(arguments));
return arguments.callee;
}
};

var multi=function () {
var total = 0;
for (var i = 0, c; c = arguments[i++];) {
total += c;
}
};

var sum = currying(multi);

sum(100,200)(300);
sum(400);
console.log(sum());     // 1000  （空白调用时才真正计算）

var addEvent = function(el, type, fn, capture) {
fn.call(el, e);
}, capture);
} else if (window.attachEvent) {
el.attachEvent("on" + type, function(e) {
fn.call(el, e);
});
}
};

return function(el, sType, fn, capture) {
fn.call(el, e);
}, (capture));
};
} else if (window.attachEvent) {
return function(el, sType, fn, capture) {
el.attachEvent("on" + sType, function(e) {
fn.call(el, e);
});
};
}
})();

Function.prototype.bind 方法也是柯里化应用

var foo = {x: 888};
var bar = function () {
console.log(this.x);
}.bind(foo);               // 绑定
bar();                     // 888

Function.prototype.testBind = function (scope) {
var fn = this;                    //// this 指向的是调用 testBind 方法的一个函数，
return function () {
return fn.apply(scope);
}
};
var testBindBar = bar.testBind(foo);  // 绑定 foo，延迟执行
console.log(testBindBar);             // Function (可见，bind之后返回的是一个延迟执行的新函数)
testBindBar();                        // 888