这个函数的参数在哪里?

时间:2018-03-31 02:11:32

标签: javascript coffeescript

我正在努力了解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

不知道该怎么做,因为我的咖啡因知识有限。

1 个答案:

答案 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()方法返回一个实际函数,然后我调用返回的函数。