如何使我的if语句正确评估?

时间:2019-05-06 04:50:39

标签: javascript p5.js

我正在创建一个秒表,它会在听到拍手声后停下来。我的第一个函数创建一个flag变量,然后调用另一个。当听到很大的声音时,flagfalse变为true,应将true返回到调用者函数。条件if语句应停止秒表。但是,我的秒表在返回true后不会停止。

function callStopwatch() {
    var watch = new Stopwatch(timer);
    watch.start();
    var flag = false;
    draw(flag);
    if(flag == true){
        watch.stop();
    }
}

function draw() {
    var vol = mic.getLevel();
    if(vol > 0.2){
        console.log("true"); //created to check whether sound detection is working
        flag = true;
        return flag;
    }
}
听到鼓掌声时,

console.logtrue返回到控制台。因此,该标志应变为true,并按原样返回并在调用程序函数的if语句中正确评估。我可能做错了什么?我的猜测是无法正确理解函数范围。

4 个答案:

答案 0 :(得分:0)

您需要做的就是在调用函数draw之后在callStopwatch()中更新您的标志变量。

 function callStopwatch() {
 var watch = new Stopwatch(timer);
 watch.start();
 var flag = false;
 flag = draw(flag); // update flag here
 if(flag == true){
    watch.stop();
 }
 }

答案 1 :(得分:0)

由于javascript是async,因此它不会等待draw()返回正确的值,它将执行您的代码async,您可以尝试在{{ 3}}。

draw(flag, function(_flag) {
    if (_flag == true) {
      //to stop watch
      console.log("its true");
    } else {
      console.log("it's false")
    }
  });

此外,您的draw()应该看起来像这样。

function draw(flag, callback) {
  var vol = 0.1; // approx value try changing it to 0.3 will return true based on condition
  if (vol > 0.2) {
    flag = true;
  }
  callback(flag);
}

答案 2 :(得分:0)

您要在两个函数中引用不同的变量。

您在flag函数中引用局部变量callStopwatch()

var flag = false;

现在您调用draw()函数,并且在这里引用全局flag

flag = true;

您将flag设置为true,但这是不同的变量,不会影响flag函数中的callStopwatch()变量

将代码更改为:

function callStopwatch() {
  var watch = new Stopwatch(timer);
  watch.start();
  var flag = draw(flag);

  if(flag == true){
    watch.stop();
  }
}

function draw() {
  var vol = mic.getLevel();
  if(vol > 0.2){
    console.log("true"); //created to check whether sound detection is working
    return true;
  }
  return false;
}

答案 3 :(得分:0)

第一个问题是您没有从draw()返回标志值。您需要记住,flag属性具有局部作用域,因此在draw()函数内部,您有一个新变量。这就是为什么更改flag函数中的draw()属性不会影响flag

中的callStopwatch属性的原因
function callStopwatch() {
    var watch = new Stopwatch(timer);
    watch.start();
    if(draw()){
        watch.stop();
    }
}

function draw() {
    let flag = false;
    var vol = mic.getLevel();
    if(vol > 0.2){
        console.log("true"); //created to check whether sound detection is working
        flag = true;
    }
    return flag;
}

第二种方法是将回调传递给draw函数。

function callStopwatch() {
    var watch = new Stopwatch(timer);
    watch.start();
    draw(function() {watch.stop();});
}

function draw(onCondition) {
    var vol = mic.getLevel();
    if(vol > 0.2){
        console.log("true"); //created to check whether sound detection is working
        onCondition()
    }
}

现在您根本不需要flag属性。