检测对象成员的无效使用

时间:2016-11-10 23:25:27

标签: javascript jslint jshint

我有一个评估器,它返回一个对象,说明是否在页面上显示某些元素,并且它包含超过50个单独的评估。因此,仅仅观察它以检测对象成员的无效使用并不容易。以下是我希望找到帮助我解决的问题的简化示例:

var simpleExample = {
    evaluationSet1: {
        foo: true
    },
    evaluationSet2: {
        bar: true
    },
    showButton: null
};

//Accidental mis-use
simpleExample.showButton = simpleExample.evaluationSet1.bar && simpleExample.evaluationSet2.bar;

在上面的示例中,showButton未正确计算并且将为false,因为没有在对象上定义evaluationSet1.bar。正确的语法是:

simpleExample.showButton = simpleExample.evaluationSet1.foo && simpleExample.evaluationSet2.bar;

是否有可以帮助检测此类无效用例的工具?我尝试过Jshint和Jslint,但似乎都没有标记它。

1 个答案:

答案 0 :(得分:1)

使用队列。如果评估是连续的并且是必需的,则从evaluationSet1处理到evaluationSetN,否则抛出错误。也就是说,不提供访问simpleExample的任何属性的选项。提供只能访问evaluationSet1的功能,该功能只能开始处理,并且只能在evaluationSetN完成处理。

主线程

const worker = new Worker("worker.js");

function handleMessageEvent(event) {
  if (event.data) {
    console.log("evaluation is true", event.data)
  } else {
    console.log("evaluation is false", event.data)
  }
}

worker.addEventListener("message", handleMessageEvent);
worker.postMessage("evaluation");

Worker帖子

function handleWorkerEvent(event) {
  let bool = true;
  if (event.data !== "evaluate") {
    bool = false;
    self.postMessage(bool);
    return;
  }

  for (let prop of Object.keys(simpleExample)) {
    let curr = simpleExample[prop];
    if (curr) {
      let keys = Object.keys(curr);
      if (keys.length) {
        for (let key of keys) {
         if (!curr[key]) {
           bool = false;
           break;
         }
        }
      }
    } else {
      bool = false; 
      break;
    }
  }
  self.postMessage(bool);
}

self.addEventListener("message", handleWorkerEvent);

data.js

const simpleExample = {
    evaluationSet1: {
        foo: true
    },
    evaluationSet2: {
        bar: true
    },
    showButton: null
};

plnkr http://plnkr.co/edit/imPuzjz14lcAFmHHWdRX?p=preview