【JavaScript进阶之旅 函数式编程篇 第三十六章】偏函数、偏函数与柯里函数的区别、惰性函数

一、偏函数

  • 函数的元:参数个数

  • 有两个参数的函数:二元函数

  • 偏函数 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());

  • 请问该函数存在什么问题:
    1. 变量全局污染、产生副作用
    2. 每次都走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());

  • 该方法存在什么问题:
    1. 每次执行都要重新赋值
解决方案
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)); // 我爱你
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值