以下是d3.js
"可重复使用的图表API"的示例。 (从here复制粘贴):
function chart() {
var width = 720, // default width
height = 80; // default height
function my() {
// generate chart here, using `width` and `height`
}
my.width = function(value) {
if (!arguments.length) return width;
width = value;
return my;
};
my.height = function(value) {
if (!arguments.length) return height;
height = value;
return my;
};
return my;
}
请注意my.width
和my.height
访问者的实体几乎完全相同。我想提出一种避免这种重复代码的方法。
以编程方式实现这些访问器的主要障碍是它们都直接在封闭的chart
函数的范围内引用变量,并且我不知道如何以符号/间接的方式引用这些变量;没有按字面意思拼写出他们的名字,就是这样。 (为了清楚起见,在这种情况下,我所讨论的变量是在chart
函数的前两行中声明的变量。)
我可以想办法解决这个问题,比如定义一些"命名空间"对象,像这样:
function chart () {
var _ns = {'width': 720,
'height': 80};
...
}
并在必要时使用width
和height
替换对_ns['width']
和_ns['height']
的引用。当然,区别在于我现在还通过_ns[somevar]
变量提供的符号引用来编写引用somevar
的通用代码。例如。上面的重复访问器定义可以用所有变量名称上的单个迭代替换:
['width',
'height',
// and whatever else one may want to add later...
].forEach(function (varname) {
my[varname] = function (value) {
if (!arguments.length) return _ns[varname];
_ns[varname] = value;
return my;
};
});
这种方法的一个缺点是由额外的间接级别引起的性能损失,即使在没有象征性地访问变量的情况下(例如在_ns['width']
或_ns.width
等表达式中)
有没有办法将变量直接保留在chart
函数的范围内,但以某种方式以符号方式访问它们? IOW,有没有类似内置"命名空间"可以在代码中扮演上述_ns
对象部分的对象,需要以符号方式迭代所有变量,但不影响引用这些变量目录的能力? (我正在考虑类似于Python的locals()
内置函数,它返回类似命名空间的对象。)
(当然,总是evil
- 我的意思是 - eval
,但我试图让代码保持正常运行。)