这个错误是合法的吗?
是的,您正在循环中声明一个函数。最重要的是,bind
它可能非常昂贵,因为它每次都必须创建一个新的词法作用域并返回一个附加到该作用域的“新”函数。
如果是,如何更好地重写这些行?
如果可以,请在循环之前声明函数并绑定一次或使用简单的闭包来避免显式绑定调用:
var scope = this;
var ruleFunc = function (rule) {
rules.data[rule] = meta[prop].data[rule] ? true : false;
}
for (var prop in cmd.properties) {
Object.keys(meta[prop].data).forEach(ruleFunc);
}
不过,我看不到您在this
函数中使用的位置,因此您可以完全删除它:
var ruleFunc = function (rule) {
rules.data[rule] = meta[prop].data[rule] ? true : false;
}
for (var prop in cmd.properties) {
Object.keys(meta[prop].data).forEach(ruleFunc);
}
这两个都需要重构代码,因为您使用闭包prop
从循环中获取变量。您可以使用bind
来解决这个问题,但性能会受到影响:
var ruleFunc = function (prop, rule) {
rules.data[rule] = meta[prop].data[rule] ? true : false;
}
for (var prop in cmd.properties) {
Object.keys(meta[prop].data).forEach(ruleFunc.bind(this, prop));
}
您还使用条件返回true
/ false
,这是一种常见的气味。您通常希望将其转换为布尔值,!!
这是惯用的 JS 方式:
rules.data[rule] = !!(meta[prop].data[rule]);
如果可以的话,避免for ... in
循环通常会让你的生活变得更好,所以你可能也想重构它:
Object.keys(cmd.properties).forEach(function (prop) {
Object.keys(meta[prop].data).forEach(function (rule) {
rules.data[rule] = !!(meta[prop].data);
});
});
您可能还可以进一步改进。