将D3函数封装在对象内部;不起作用.为什么?
Wrapping D3 functions inside objects doesn't work. Why?
如果我将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
该区块应为:
return d3.scale.ordinal()
.domain([0, 2])
.rangePoints([0, 1024])
.call(null, n);
这是一把小提琴:http://jsfiddle.net/cesutherland/5gY6Z/2/
很明显,d3返回的函数在调用它时保持了某种状态。然而,当分配给obj
时,每次调用它都会重新创建它
因为没有维护任何状态,所以无法计算适当的结果。
如果您试图直接调用函数的实例,这可能是一种更好的方法:
var obj = {
returnResult: d3.scale.ordinal()
.domain([0, 2])
.rangePoints([0, 1024])
}
这将允许你做你现在正在做的事情,而不需要每次都重新创建对象。
相关文章:
- Js.erb VS按钮标记-不'不起作用.为什么?
- 我的jquery代码不起作用.为什么?
- 代码在firefox中运行良好,但在chrome中不起作用.为什么?
- 谷歌地图 JS API v3:使用 containsLocation() 获取圆圈标记不起作用 - 为什么
- 为函数中的现有数组(全局变量)分配新值不起作用.为什么
- Firefox Addon Builder首选项-服务对我不起作用--为什么
- 将D3函数封装在对象内部;不起作用.为什么?
- 敲除绑定处理程序不起作用:为什么
- I'我试图让jquery在我的chrome扩展的background.js中工作,结果成功了;不起作用.为什么?
- blueimp 文件上传插件中的 max文件大小和接受文件类型不起作用.为什么
- 我有两个具有相同代码的不同域,但其中一个不起作用.为什么
- 简单的HTML/CSS选项卡导航在Safari 9中不起作用.为什么
- Jquery focus()和blur()对我的href不起作用.为什么
- 承诺链不起作用.为什么
- 返回页首滚动jquery在chrome中不起作用.为什么?它在firefox中运行良好
- 为什么是宽度100%的html代码全栏不工作,当我写.忘了那个吧,连复制粘贴都不起作用.为什么
- 使用for循环在数组中查找字符串是有效的,但是这里的forEach()不起作用.为什么以及如何纠正
- 附加html上的preventDefault()不起作用.为什么?
- jQuery元素上的加号或减号不起作用.为什么?
- jquery的正则表达式选择器不起作用.为什么