一、偏函数
-
函数的元:参数个数
-
有两个参数的函数:二元函数
-
偏函数
partial Application
:在计算机科学中,偏函数叫做部分应用,局部应用,指固定一个函数的一些参数,然后产生另一个更小元的函数
二、偏函数与柯里函数区别
-
柯里化:将一个多参数的函数转换成多个单参数的函数(将n元函数转换为n个一元函数)
-
偏函数:是固定一个函数的一个或多个参数(将n元函数转换为n-x元的函数)
1、身边的偏函数bind
function add(a, b, c, d) {
return a + b + c + d;
}
// 身边的偏函数:bind()
var newAdd = add.bind(null, 1, 2);
console.log(newAdd, 3, 4);
2、封装偏函数
function add(a, b, c, d) {
return a + b + c + d;
}
// 偏函数
Function.prototype.partial = function() {
var _self = this,
args = [].slice.call(arguments);
return function() {
var newArgs = args.concat([].slice.call(arguments));
return _self.apply(this, newArgs);
}
}
var newAdd = add.partial(1, 2);
console.log(newAdd(3, 4)); // 10
3、案例
Function.prototype.partial = function() {
var _self = this,
args = [].slice.call(arguments);
return function() {
var newArgs = args.concat([].slice.call(arguments));
return _self.apply(this, newArgs);
}
}
function formatSentence(time, opt) {
return time + ' ' + opt.user_class + ' ' + opt.name + ': ' + opt.sentence;
}
var outPutSentence = formatSentence.partial(new Date().getHours());
console.log(outPutSentence({
user_class: 'lybweb',
name: 'ICAN',
sentence: '热爱新技术,始于前端,不止于前端'
})); // 23 lybweb ICAN: 热爱新技术,始于前端,不止于前端
三、惰性函数
本身是用来优化函数的,在运行过程中的一些鸡肋
1、案例
- 一个函数执行多次,返回同一个结果
写法一
var timeStamp = null;
function getTimeStamp() {
if(timeStamp) {
return timeStamp;
}
timeStamp = new Date().getTime();
return timeStamp;
}
console.log(getTimeStamp());
console.log(getTimeStamp());
console.log(getTimeStamp());
console.log(getTimeStamp());
- 请问该函数存在什么问题:
- 变量全局污染、产生副作用
- 每次都走if
写法二
var getTimeStamp = (function() {
var timeStamp = new Date().getTime();
return function() {
return timeStamp;
}
})();
console.log(getTimeStamp());
console.log(getTimeStamp());
console.log(getTimeStamp());
console.log(getTimeStamp());
- 该方法存在什么问题:
- 每次执行都要重新赋值
解决方案
var getTimeStamp = (function() {
var timeStamp = new Date().getTime();
getTimeStamp = function() { // 重写函数,函数内部改变自身机制,也是惰性函数的机制
return timeStamp;
}
return timeStamp;
});
console.log(getTimeStamp());
console.log(getTimeStamp());
console.log(getTimeStamp());
console.log(getTimeStamp());
- 再优化:
var getTimeStamp = (function() {
var timeStamp = new Date().getTime();
getTimeStamp = function() { // 重写函数,函数内部改变自身机制,也是惰性函数的机制
return timeStamp;
}
return getTimeStamp(); // 返回该函数
});
2、概念
- 惰性函数:惰性加载表示函数执行的分支只会在函数第一次调用的时候执行,在第一次调用的过程中,该函数被覆盖为另一个按照合适的方式执行的函数。这样任何对原函数的调用就不用再经过执行的分支了
3、惰性函数版事件处理函数
- 柯里化版本:
var addEvent = (function() {
if(window.addEventListener) {
return function(el, type, fn, capture) {
el.addEventListener(type, fn, capture);
}
}else if(window.attachEvent) {
return function(el, type, fn) {
el.attachEvent('on' + type, function() {
fn.call(el);
});
}
}else {
return function(el, type, fn) {
el['on' + type] = fn;
}
}
})();
- 惰性函数版本:
var addEvent = function(el, type, fn, capture) {
if(el.addEventListener) {
addEvent = function(el, type, fn, capture) {
el.addEventListener(type, fn, capture);
}
}else if(el.attachEvent) {
addEvent = function(el, type, fn) {
el.attachEvent('on' + type, function() {
fn.call(el);
});
}
}else {
addEvent = function(el, type, fn) {
el['on' + type] = fn;
}
}
return addEvent(el, type, fn, capture);
}
4、案例
function test(num) {
switch(num) {
case 1:
test = function() {
return '我爱你';
}
break;
case 2:
test = function() {
return '我喜欢你';
}
break;
}
return test();
}
console.log(test(1)); // 我爱你