JavaScript中匿名函数的占位符
Placeholders for anonymous functions in JavaScript
我一直在写d3
代码,它最终有很多这样的功能:
selection.attr('x', function(d) { return d.layout.x; });
有没有任何方法可以模拟Scala的占位符语法,这将允许我编写以下内容:
selection.attr('x', _.layout.x);
显然,getter需要被告知要应用的特定参数名称,或者可以定义一种"元getter",它用一个匿名函数来响应,该函数获取所需的命名属性。
我很想知道CoffeeScript中是否存在类似的内容。ES6 lambda函数更接近,但仍然不如占位符语法那样语义清晰。
您没有说明希望在什么环境中运行,因此,假设出血边缘是可以的,让我们使用Proxy
:
var _ = new Proxy({}, {
get: function(target, name) {
return createProxyForPath(name, []);
}
});
function createProxyForPath(name, path) {
var newPath = path.slice();
newPath.push(name);
return new Proxy({}, {
get: function(target, name) {
if (name !== "$") return createProxyForPath(name, newPath);
return function getter(obj) {
return newPath.reduce(function(prev, curr) {
return prev[curr];
}, obj);
};
},
apply: function(target, context, args) {
// TODO: Preserve function calls and args here
}
});
}
你会这样使用它:
> [{x: 1}, {x: 2}, {x: 3}].map(_.x.$)
[1, 2, 3]
它并不能完全取代Scala的神奇下划线(例如,它现在没有陷阱方法调用,所以不能用_.x.toString().slice(0, 3)
来举一个例子(。此外,它需要一个显式的$
来表示链的结束。但对于简单的getter来说,它运行得很好。
或者,如果你现在需要支持不是Firefox的浏览器,你可以写一个sweet.js宏来生成getter:
// Via Daniel
macro _ {
rule { . $m ... } => { function (value) { return value.$m ... } }
}
selection.attr('x', _.layout.x + 1);
将扩展到:
selection.attr('x', function(value) {
return value.layout.x + 1;
});
(如果你自己在函数sweet.js中使用value
,你会做正确的事情,并将参数重命名为value$some-integer
,以避免匿名函数中的任何名称冲突。(
它确实处理方法调用,但当然,这些方法都不能将占位符用作函数参数:
selection.attr('x', someFunction(_));
这可以用一个函数而不是一个对象来模拟:
var getter = function(properties) {
props = properties.split('.');
return function(d) {
return props.reduce(function(prev, curr) {
return prev[curr];
}, d);
};
};
selection.attr('x', getter('layout.x'));
这是…好吧,但我想知道JS是否能做得更好。
相关文章:
- 使用javascript的Asp.net内容占位符
- Internet Explorer缺少占位符支持,特别是密码字段
- 如何隐藏按钮单击事件上的占位符
- 需要URL模板占位符查找和替换功能的输入
- 初始化ng模型时,Angular ui选择占位符不起作用
- 如何在ie7或更高版本中设置密码字段的占位符
- 在不使用javascript的情况下,可以在表单字段中设置文本占位符(以提示最终用户插入特定格式)
- Select2-使用自定义模板时不显示占位符
- 替换字符串中的占位符值
- 为什么我应该使用HTML5(上下文:占位符)
- 函数来替换占位符文本
- 如何在 JavaScript 中使用变量或函数名称作为对象属性的占位符
- 为什么 removeAttr('占位符') jquery 函数没有从输入中删除:p蕾丝持有人显示的伪类
- 如何针对表格进行测试's”;input.占位符”;JavaScript函数的属性
- 有没有一个js函数可以让占位符属性在IE中工作
- 使用javascript绑定函数时的参数占位符
- 占位符宽度函数抛出Uncaught TypeError: Cannot read property 'lengt
- Javascript,如何向函数发送占位符变量
- 如何编写一行可以添加到showpic函数末尾的代码,该函数更新占位符元素上的alt属性
- JavaScript中匿名函数的占位符