在d3-drag库中`constant.js`的目的是什么?

时间:2017-02-02 23:37:47

标签: javascript d3.js ecmascript-6

稍微查看d3-drag javascript(es6)模块的source code,我发现有一个名为constant.js的文件,其全部内容为:

export default function(x) {
  return function() {
    return x;
  };
}

这是在drag.js

中导入的
import constant from "./constant";

然后使用(显示三个类似实例中的一个):

drag.container = function(_) {
    return arguments.length ? (container = typeof _ === "function" ? _ : constant(_), drag) : container;
  };

也许我只是不完全了解javascript的所有回调荣耀,但我不太了解constant.js模块的目的。有人能够对这里发生的事情有所了解吗?

1 个答案:

答案 0 :(得分:3)

好吧,让我们一步一步

export default function(x) {
  return function() {
    return x;
  };
}

是一个函数,它将返回一个导致第一个参数的函数,例如

var fn = constant(4);
fn() === 4;

现在让我们来看看

drag.container = function(_) {
  return arguments.length 
    ? (container = typeof _ === "function" ? _ : constant(_), drag)
    : container;
};

注意,这使用了一个未在此声明的变量container,并且存在于外部作用域中。有两个部分,一个是结果取决于使用模式,另一个取决于传入的类型。所以让我们将它分开:

var container;

drag.container = function(_) {
  if (arguments.length > 0) {
    if (typeof _ === "function") {
      container = _;
    } else {
      container = constant(_);
    }
    return drag;
  } else {
    return container;
  }
};
  • 在没有参数的情况下调用.container()时,将返回container变量的当前值。
  • 调用.container(foo)时,如果foo是函数,则该函数变为container值,如果在没有函数的情况下调用它,则constant用于创建一个返回非函数值foo的函数。

因此constanttypeof相结合意味着container始终是一个返回值的函数。