gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:45:50 25 4
gpt4 key购买 nike

如果我将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com