【问题标题】:Define this function outside of a loop在循环之外定义这个函数
【发布时间】:2018-06-08 06:54:42
【问题描述】:

我有以下代码:

for (var entry in metadata) {
     if (metadata.hasOwnProperty(entry)) {
         var varName = metadata[entry].variableName;
         if (metadata[entry].multipleValues === "false") {
             if (angular.isDefined(vm[varName]) && (vm[varName] !== null) && vm[varName].id !== null) {
                 filters.push(factory.buildEntry(metadata[entry].variableName, vm[varName].id, null, factory.filterOperators.textContains));
             }
         } else {
             if (angular.isDefined(vm[varName]) && (angular.isArray(vm[varName])) && (vm[varName].length > 0)) {
                 filters.push(factory.buildEntry(metadata[entry].variableName, null, vm[varName].map(function (item) {
                     return item.id;
                 }), factory.filterOperators.textContains));
             }
         }
     }
}

但是 SonarQube 一直告诉我 Define this function outside of a loop.,而我在这个循环中的唯一函数是我传递给 Array.prototype.map() 方法的匿名函数:

function (item) {
    return item.id;
}

如果我在循环之外定义它,这将毫无用处,因为它的主体只包含一行代码。

为什么我会收到此错误?以及如何告诉 SonarQube 跳过它。

【问题讨论】:

  • 你自己弄清楚了错误的原因。 how can I tell SonarQube to skip it? --> 如果可能,您可能可以添加某种评论。否则,您必须在 SonarQube 界面上将其标记为误报。
  • 您使用的是哪个版本的 SonarJS? SonarJS 3.0 中修复了票 jira.sonarsource.com/browse/SONARJS-772,这似乎是您的情况

标签: javascript sonarqube


【解决方案1】:

如何在循环之外定义它

var mapFunction = function (item) {
                     return item.id;
                 };
for (var entry in metadata) {
     if (metadata.hasOwnProperty(entry)) {
         var varName = metadata[entry].variableName;
         if (metadata[entry].multipleValues === "false") {
             if (angular.isDefined(vm[varName]) && (vm[varName] !== null) && vm[varName].id !== null) {
                 filters.push(factory.buildEntry(metadata[entry].variableName, vm[varName].id, null, factory.filterOperators.textContains));
             }
         } else {
             if (angular.isDefined(vm[varName]) && (angular.isArray(vm[varName])) && (vm[varName].length > 0)) {
                 filters.push(factory.buildEntry(metadata[entry].variableName, null, vm[varName].map(mapFunction), factory.filterOperators.textContains));
             }
         }
     }
}

您可以将函数分配给变量,然后将该变量视为函数

var foo = function(){console.log('bar')};
foo();

在您的情况下,通过将映射函数分配给一个变量,然后将该变量传递给 .map() 也可以提高效率,因为不必在每次循环运行时都重新实例化该函数。它可以一遍又一遍地重复使用相同的功能。

一旦执行循环的封闭函数结束,变量就不再存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多