我在我目前正在工作的项目中偶然发现了一行代码。我觉得我在Javascript方面不错,但说实话,我不知道以下代码行是什么实际上:
var date = new (Function.prototype.bind.apply(Date, [null,].concat(buildDateParams(spec, base))));
你们这些Javascript专家可能会对此有所了解吗?
buildDateParams
似乎构建了一个值数组。为了完整性'为了这个功能:
function buildDateParams(spec, base) {
if (!spec.match(specRegExp)) {
throw new Error('Invalid spec string');
}
var specParts = spec.toLowerCase().split(':');
let params = [];
for (let fieldIndex in fields) {
let field = fields[fieldIndex];
let specPart = (fieldIndex < specParts.length)
? specParts[fieldIndex]
: '0';
if (!specPart.length) {
specPart = 'b';
}
let param = 0;
if (specPart.substr(0, 1) === 'b') {
param = base[field.getter]();
specPart = specPart.substr(1);
}
if (specPart.length) {
param += parseInt(specPart);
}
params.push(param);
}
return params;
}
答案 0 :(得分:5)
它是
的复杂版本Date.bind(null, buildDateParams(spec, base));
除了一个有效的;我们的想法是,它希望将Date构造函数绑定到由buildDateParams()
函数生成的一组参数。
使用ES2015扩展语法,它可以写
Date.bind(null, ... buildDateParams(spec, base));
它只是根据一些预先安排的参数创建一个返回Date实例的函数。
此外,由于[null,]
数组初始值设定项中的逗号逗号,它可能在IE中存在问题(尽管带有.bind()
的现代IE可能不会将该数组解释为具有两个元素)。