稍微查看d3-drag
javascript(es6)模块的source code,我发现有一个名为constant.js
的文件,其全部内容为:
export default function(x) {
return function() {
return x;
};
}
这是在drag.js
:
import constant from "./constant";
然后使用(显示三个类似实例中的一个):
drag.container = function(_) {
return arguments.length ? (container = typeof _ === "function" ? _ : constant(_), drag) : container;
};
也许我只是不完全了解javascript的所有回调荣耀,但我不太了解constant.js
模块的目的。有人能够对这里发生的事情有所了解吗?
答案 0 :(得分:3)
好吧,让我们一步一步
export default function(x) {
return function() {
return x;
};
}
是一个函数,它将返回一个导致第一个参数的函数,例如
var fn = constant(4);
fn() === 4;
现在让我们来看看
drag.container = function(_) {
return arguments.length
? (container = typeof _ === "function" ? _ : constant(_), drag)
: container;
};
注意,这使用了一个未在此声明的变量container
,并且存在于外部作用域中。有两个部分,一个是结果取决于使用模式,另一个取决于传入的类型。所以让我们将它分开:
var container;
drag.container = function(_) {
if (arguments.length > 0) {
if (typeof _ === "function") {
container = _;
} else {
container = constant(_);
}
return drag;
} else {
return container;
}
};
.container()
时,将返回container
变量的当前值。.container(foo)
时,如果foo
是函数,则该函数变为container
值,如果在没有函数的情况下调用它,则constant
用于创建一个返回非函数值foo
的函数。因此constant
与typeof
相结合意味着container
始终是一个返回值的函数。