我正在努力了解https://trianglify.io/的https://github.com/qrohlf/trianglify源代码,可以在https://github.com/gka/chroma.js/blob/master/src/scale.coffee找到。在lib / trianglify.js文件中,我遇到了以下几行代码:
var x_color = chroma.scale(opts.x_colors).mode(opts.color_space);
var y_color = chroma.scale(opts.y_colors).mode(opts.color_space);
gradient = function(x, y) {
return chroma.interpolate(x_color(x), y_color(y), 0.5, opts.color_space);
};
我的问题是当x_color(x)被调用时," x"争论到了吗?如果这个参数没有出现在定义中,它如何传递给函数?我这样做的主要目的是为x_color()添加一些额外的自定义参数,但如果我不知道如何在函数中处理参数,我就无法做到这一点。
EDIT .mode(opts.color_space)函数可以在{{3}}第158行找到。它的内容如下:
f.mode = (_m) ->
if not arguments.length
return _mode
_mode = _m
resetCache()
f
不知道该怎么做,因为我的咖啡因知识有限。
答案 0 :(得分:0)
色度是chroma.js
的一部分。
查看代码,chroma.scale(...)
使用fluent methods构建一个包含原型的函数。
f = function(v) {
var c;
c = chroma(getColor(v));
if (_out && c[_out]) {
return c[_out]();
} else {
return c;
}
};
f.mode = function(_m) {
if (!arguments.length) {
return _mode;
}
_mode = _m;
resetCache();
return f;
};
因此,当您调用chroma.scale(...)
时,它会返回f,然后当您在返回的对象上调用.mode(...)
时,它会再次返回相同的实例f。
f的实例由以下方法创建:
chroma = function() {
if (arguments[0] instanceof Color) {
return arguments[0];
}
return (function(func, args, ctor) {
ctor.prototype = func.prototype;
var child = new ctor, result = func.apply(child, args);
return Object(result) === result ? result : child;
})(Color, arguments, function(){});
};
如您所见,这会使用arguments对象。 Mozilla将arguments对象定义为:
arguments对象是一个类似于Array的对象,对应于传递给函数的参数。
简而言之,即使您没有在函数签名中指定参数名称,arguments对象仍然存在,您传递的任何参数都将存在于arguments数组中。
我创建了一个使用参数array here
的示例function a() {
alert(arguments[0] + ' is ' + arguments[1] + ' years old.');
}
function b(name) {
return function test() {
alert(name + ' will vw ' + arguments[0] + ' years old on his next birthday.');
}
}
a('John', 29);
var example2 = b('John');
example2(30);
在第一个例子中,有一个直接函数调用,但在第二个例子中,我从b()
方法返回一个实际函数,然后我调用返回的函数。