09-数组中的函数
13.6.1 数组中的函数
以往,数组中的函数并不经常被使用,但它的使用率却在升高,并且在一些特定场景中极其有用。管道就是一个这样的场景:它好比要频繁执行的一系列独立操作。使用数组的好处是可以随时修改它。比如,如何移除一个操作?把它从数组中移除就行。增加操作呢?向数组中添加一个元素就可以了。
图形转换就是一个这样的例子。如果开发一个可视化软件,通常会有一个在很多点上都会用到的转换“管道”。这是一个常见的二维转换示例:
const sin = Math.sin;
const cos = Math.cos;
const theta = Math.PI/4;
const zoom = 2;
const offset = [1, -3];
const pipeline = [
function rotate(p) {
return {
x: p.x * cos(theta) - p.y * sin(theta),
y: p.x * sin(theta) + p.y * cos(theta),
};
},
function scale(p) {
return { x: p.x * zoom, y: p.y * zoom };
},
function translate(p) {
return { x: p.x + offset[0], y: p.y + offset[1]; };
},
];
//此时pipeline是一个包含了特殊2D转换的函数数组
//我们可以转换一个点:
const p = { x: 1, y: 1 };
let p2 = p;
for(let i=0; i<pipeline.length; i++) {
p2 = pipeline[i](p2);
}
// 此时p2是p1基于开始位置旋转45度(pi/4弧度),然后向前移动2个单位,向右1一个
// 单位,向下3个单位,所得出的点
这是一个非常基础的图形转换示例,希望通过它,你能够感受到将函数存储在数组中的力量。注意,在管道中使用函数的语法: pipeline[i] 访问索引为i的元素,该元素是一个函数。那么此时对应的函数会被调用(使用括号)。点被传到函数中,然后又被赋给自己。这样一来,该点的值就是管道中每一步执行的累积结果。
管道处理不仅存在于图形应用中,同样流行于音频处理、科学和工程学应用中。事实上,任何时候当需要按照指定顺序执行一系列函数时,管道都是一个有用的抽象原则。