D3:用命名函数替换匿名函数
D3: replacing anonymous function with a named one
我的缩写工作 D3 代码,带有一个数字补间:
vLabel.transition()
.tween('text', function() {
var n = d3.interpolateNumber(0, frames[i].V);
return function(t) {d3.select(this).text(n(t).toFixed(1)+'%');};
});
由于稍后在一系列步进动画中,相同类型的过渡将应用于许多其他元素,因此我想将匿名函数转换为命名函数以供重用。但是,我在下面的尝试会生成 NaN
而不是数字。
function runNumber(start, end, decimal) {
var n = d3.interpolateNumber(start, end);
return function(t) {d3.select(this).text(n(t).toFixed(decimal)+'%');};
}
vLabel.transition()
.tween('text', runNumber(0, frames[i].V, 1));
我也试过将 d3.select(this).tween
放入函数中并使用 call()
方法调用修改后的函数,但这产生了一个彻底的错误 ("tween is not a function...")。作为 JS 的新手,我怀疑问题与我对 this
的脆弱掌握有关,尽管我不知道如何修复它。
为了具有与原始代码相同的行为,您需要 return 来自 runNumber
的函数(调用时它本身 return 是一个函数)。这应该有效(未经测试):
function runNumber(start, end, decimal) {
return function() {
var n = d3.interpolateNumber(start, end);
return function(t) {
d3.select(this).text(n(t).toFixed(decimal) + '%');
};
};
}
我的缩写工作 D3 代码,带有一个数字补间:
vLabel.transition()
.tween('text', function() {
var n = d3.interpolateNumber(0, frames[i].V);
return function(t) {d3.select(this).text(n(t).toFixed(1)+'%');};
});
由于稍后在一系列步进动画中,相同类型的过渡将应用于许多其他元素,因此我想将匿名函数转换为命名函数以供重用。但是,我在下面的尝试会生成 NaN
而不是数字。
function runNumber(start, end, decimal) {
var n = d3.interpolateNumber(start, end);
return function(t) {d3.select(this).text(n(t).toFixed(decimal)+'%');};
}
vLabel.transition()
.tween('text', runNumber(0, frames[i].V, 1));
我也试过将 d3.select(this).tween
放入函数中并使用 call()
方法调用修改后的函数,但这产生了一个彻底的错误 ("tween is not a function...")。作为 JS 的新手,我怀疑问题与我对 this
的脆弱掌握有关,尽管我不知道如何修复它。
为了具有与原始代码相同的行为,您需要 return 来自 runNumber
的函数(调用时它本身 return 是一个函数)。这应该有效(未经测试):
function runNumber(start, end, decimal) {
return function() {
var n = d3.interpolateNumber(start, end);
return function(t) {
d3.select(this).text(n(t).toFixed(decimal) + '%');
};
};
}