我正在创建一个秒表,它会在听到拍手声后停下来。我的第一个函数创建一个flag
变量,然后调用另一个。当听到很大的声音时,flag
从false
变为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.log
将true
返回到控制台。因此,该标志应变为true
,并按原样返回并在调用程序函数的if
语句中正确评估。我可能做错了什么?我的猜测是无法正确理解函数范围。
答案 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属性。