Javascript: 从另一个文件调用 D3 中的函数

Javascript: calling function within D3 from another file

我想在 d3.js 脚本中重写几个与布局之一相关的函数。当我将这些函数剪切并粘贴到单独的文件中并在 d3.js 之后加载它们时,可视化不再起作用,因为内部函数调用 d3.js 的内部函数。

d3.js:

!function() {
  var d3 = { version: "3.5.17" };
  function d3_funct() { return d3; } // this function is called in the other file
}();

chord.js:

d3.svg.chord() = function() {
  var funct = d3_funct; // doesn't work
};

问题:

d3_funct 在另一个文件的立即执行的函数表达式中定义时,我如何在我的脚本 chord.js 中使用上述函数 d3_funct

选项:

  1. 直接编辑d3.js文件而不是拉出函数重写:(
  2. 重命名封闭的 d3 函数并使用 jQuery 将其加载到 chord.js.

我错过了什么吗?

所以,你的执行顺序应该是:

  1. 加载d3.js
  2. 加载您的自定义修改
  3. 加载其余代码

您的修改文件应该类似于:

function myBetterD3Funct () { ... }
d3.d3_funct = myBetterD3Funct;

以上是迄今为止最好的选择。非常清楚您在做什么,不需要您每次下载最新版本时都修改 d3.js 文件(因此允许您使用 d3 cdn 为您的用户提供 d3.js 服务) .

如果您不想覆盖 d3 全局函数本身,还有另一个选项。我警告您,以下内容可能不适用于所有情况,具体取决于您的 myBetterD3Funct 的复杂程度以及它需要在 d3.

中访问的内容
function myBetterD3Funct () { ... }
myBetterD3Funct.apply(d3);

这样做是将函数的范围(在运行时)设置为全局 d3 对象。这将允许它使用 this 引用全局 d3 对象中的顶级属性。如下面的评论所述,代码中的许多函数和变量是 written to be private,因此您无法以任何方式访问它们(修改源代码除外)。