Kas*_*sia 6 javascript closures loops jshint
JSHint 显示错误:“在引用外部作用域变量的循环内声明的函数可能会导致语义混淆”。如何改进以下代码以消除警告?
var getPrecedence = function getPrecedence(operator, operators) {
var keys = Object.keys(Object(operators));
for (var i = 0, len = keys.length; i < len; i++) {
var check = Object.keys(operators[keys[i]]).some(function (item) {
return item === operator;
});
if (check) return operators[keys[i]][operator];
}
};
Run Code Online (Sandbox Code Playgroud)
你不应该在循环体内部使用函数表达式,而是在外部声明它:
function getPrecedence(operator, operators) {
function isOperator(item) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
return item === operator;
}
var keys = Object.keys(Object(operators));
for (var i = 0, len = keys.length; i < len; i++) {
var check = Object.keys(operators[keys[i]]).some(isOperator);
// ^^^^^^^^^^
if (check) return operators[keys[i]][operator];
}
}
Run Code Online (Sandbox Code Playgroud)
当然,整个过程可以通过使用includes而不是some,而find不是循环来简化:
function getPrecedence(operator, operators) {
var keys = Object.keys(Object(operators));
var opkey = keys.find(key =>
Object.keys(operators[key]).includes(operator)
);
if (opkey) return operators[opkey][operator];
}
Run Code Online (Sandbox Code Playgroud)
最后,Object.keys(…).includes(…)可以简化为.operator in operators[key]