javascript - 将 D3 函数包装在对象内不起作用。为什么?

标签 javascript d3.js

如果我将 d3.scale 函数分配给一个变量,我可以传入一个数字,它会正确缩放该数字。

但是,如果我将相同的函数包装在一个对象中,它不会返回我期望的答案。为什么?

var applyScale1 = d3.scale.ordinal()
    .domain([0, 2])
    .rangePoints([0, 1024]);

console.log(typeof(applyScale1));     // "function"
console.log(applyScale1(1));          // 0
console.log(applyScale1(5000));       // 1024 *Correct*

// But wrapping that in an object doesn't work. Why?

var obj = {

  returnResult: function(n) {
    var fn = d3.scale.ordinal()
      .domain([0, 2])
      .rangePoints([0, 1024]);

    return fn(n);
  },

  returnFunction: function() {
    return d3.scale.ordinal()
      .domain([0, 2])
      .rangePoints([0, 1024]);
  },

  withCall: function(n) {
    var fn = d3.scale.ordinal()
      .domain([0, 2])
      .rangePoints([0, 1024]);

    var nScaled = fn.call(n);
    return nScaled;
  },

  applySelf: function(n) {
    var self = this;
    var fn = d3.scale.ordinal()
      .domain([0, 2])
      .rangePoints([0, 1024]);

    var nScaled = fn.apply(self, [n]);
    return nScaled;
  },

  usingCall: function(n) {
    return d3.scale.ordinal()
      .domain([0, 2])
      .rangePoints([0, 1024])
      .call(n);
  },
};

console.log(obj.returnResult(1));         // = 0
console.log(obj.returnResult(5000));      // = 0 * Wrong *

console.log(obj.returnFunction()(1));     // = 0
console.log(obj.returnFunction()(5000));  // = 0 * Wrong *

console.log(obj.withCall(1));             // = 0
console.log(obj.withCall(5000));          // = 0 * Wrong *

console.log(obj.applySelf(1));            // = 0
console.log(obj.applySelf(5000));         // = 0 * Wrong *

console.log(obj.usingCall(1));            // = 0
console.log(obj.usingCall(5000));         // = 0 * Wrong *

最佳答案

您使用的是序数尺度,这是一个具有离散域的尺度。在您的情况下,该离散域是集合 {0, 2}。我不确定如果您输入一个不在该集合 1024 中的数字,该行为将如何定义,但我相信 d3 未定义此行为。

如果传入 0 或 2,结果将如预期。

另一个问题在这个声明中:

return d3.scale.ordinal()
  .domain([0, 2])
  .rangePoints([0, 1024])
  .call(n);

要调用的第一个参数是“thisArg”:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

该 block 应为:

return d3.scale.ordinal()
  .domain([0, 2])
  .rangePoints([0, 1024])
  .call(null, n);

这是一个 fiddle :http://jsfiddle.net/cesutherland/5gY6Z/2/

关于javascript - 将 D3 函数包装在对象内不起作用。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18034777/

相关文章:

javascript - 调用函数 ogads load.php

javascript - 如何使用 .click 函数从 div 中为变量提供字符串

javascript - 分组条形图和折线图

javascript - D3.js 刷行为触发两个 'end' 事件

javascript - 需要另一个使用属性定义 Controller 的指令的 Angular 指令

javascript - 如何从 firefox 浏览器中将选定的文本写为图像

javascript - 我将如何以及为何使用回调?我的解释和需要的保证

d3.js - D3 : show years on first month and on January, 并将刻度移动到柱线中点

javascript - d3 可折叠搜索树 - 在每次搜索时删除旧的 stokes

javascript - D3 - 在循环中插入内部元素