javascript函数未定义,但正在加载我的脚本

javascript函数未定义,但正在加载我的脚本,javascript,Javascript,因此,我试图掌握JavaScript,并尝试进行反应时测试。这个想法很简单:你点击一个按钮,在一段随机的时间后背景会改变颜色,然后你必须点击第二个按钮,这个按钮会调用一个计算你反应时间的函数。以下是我的JavaScript代码: function start(){ console.log(start); var rndnr = (Math.round(Math.floor(Math.random() * 5) + 1)) * 1000); setTimeout(funct

因此,我试图掌握JavaScript,并尝试进行反应时测试。这个想法很简单:你点击一个按钮,在一段随机的时间后背景会改变颜色,然后你必须点击第二个按钮,这个按钮会调用一个计算你反应时间的函数。以下是我的JavaScript代码:

function start(){
    console.log(start);
    var rndnr = (Math.round(Math.floor(Math.random() * 5) + 1)) * 1000);
    setTimeout(function timeout() {
      document.bgColor="ffff00";
      start = new Date();
    }, rndnr);
}

function stop() {
    var onclick = new Date();
    var time = onclick-start;
    var total;
    var avg;
    var count = 1;
    document.getElementById("try 1").innerHTML = time;
    total = total + time;
    avg = total / count;
    count = count + 1;
    document.getElementById("avg1").innerHTML = avg;
}
这些是我的按钮:

<button id="button" onclick="start()" >start</button>
<button onclick="stop()">stop</button>
开始
停止
当我尝试执行脚本时,控制台日志中出现一个错误,上面写着:
ReferenceError:start未定义
。我哪里出错了?

编辑:

这是您的代码的工作版本(只有停止按钮需要标记“try 1”和“avg”)

问题出在额外的)上:

这是正确的版本:

var rndnr = (Math.round(Math.floor(Math.random()*5)+1))*1000;
我改变了将事件绑定到元素的方式,将事件嵌入内联不是一个好的做法。相反,请尝试下一种方法:

document.getElementById('start').onclick=function(){start();};
document.getElementById('stop').onclick=function(){stop();};
关于这方面的更多信息,这里有另一个问题:

这是错误的

一定是这样

console.log("start"); 
或者您必须创建变量start

var start = "put anything in here";
console.log(start);
语法错误,应该是

var rndnr = (Math.round(Math.floor(Math.random()*5)+1))*1000;

要确保文档了解
start
功能,请执行以下操作:

window.start = function start(){ ... };
或者确保在分配处理程序之前加载脚本

其次,不要试图将值设置为start,因为start指的是函数。改用
startTime
或其他变量

startTime = new Date();

您需要在setTimeout函数中重命名变量
start
,因为在第一次调用
start()
函数之后,您会用日期值重写函数start

函数f(){
setTimeout(函数(){f=1;},1000);
}
console.log(f);//功能
f();
setTimeout(函数(){
console.log(f);//1

}, 1100);您的代码中有相当多的打字错误以及一些命名冲突和范围问题。这是您的原始代码(除了在浏览器中将
stop
重命名为
stopF
之外)

函数开始(){
console.log(启动);
//参考错误源于这一行阻止函数
//从被定义
var rndnr=(Math.round(Math.floor(Math.random()*5)+1))*1000;
setTimeout(函数超时(){
document.bgColor=“ffff00”;
开始=新日期();
},rndnr);
}
函数stopF(){
var onclick=新日期();
var时间=点击-启动;
总风险价值;
var平均值;
var计数=1;
document.getElementById(“try 1”).innerHTML=time;
总计=总计+时间;
平均值=总数/计数;
计数=计数+1;
document.getElementById(“avg1”).innerHTML=avg;
}
开始
停止

函数似乎没有在全局范围内声明?确切的错误消息是什么?是:“ReferenceError:start未定义”还是“ReferenceError:start不是函数”?您可能试图在声明函数之前调用该函数。您是否一直等到dom加载?start是一个函数,您重新定义了开始日期?这是正确的,可能不是OP的意图,这与提到的错误有什么关系?请尝试在函数中记录函数引用。在控制台中不会出错。start是函数的定义名称。存在他为什么要打印函数?函数start中不存在start。这就是错误。感谢downvote,顺便说一句@Kbi,虽然OP尝试记录函数(这似乎是一个错误),但错误并非来自此。这段代码永远不会执行。有关错误的原因,请参阅。@Kbi我投了反对票,因为。放松讽刺并尝试一下。虽然这些都是很好的建议,但它们并没有回答OP的问题。有关引用错误的原因,请参阅。@jason他们是否确实回答了问题
Uncaught ReferenceError:start未定义
OP没有要求修复其代码,而是要求修复导致问题的原因。
ReferenceError
是由于JS引擎由于额外的“')无法解析函数的代码而产生的。虽然您提到的值得注意,但函数从未声明过,因为
Uncaught SyntaxError:Unexpected token)
错误。我还修复了代码,指出了在修复该错误后可能会影响它的其他问题。OP没有提到
SyntaxError
,因此他的问题很可能包含对其原始代码的稍微修改版本。由于内联JS的工作方式,这是两个错误的原因。由于OP承认自己是JS新手(或者至少试图掌握它),他们可能没有注意到
SyntaxError
。或者如果他们真的注意到了,也许他们不认为这有什么关系。这就是说,这是因为
SyntaxError
函数从未定义,因此当内联JS被计算时,它试图执行一个不存在的函数,从而导致
ReferenceError
。我只是编辑来展示这个。检查控制台输出。
var rndnr = (Math.round(Math.floor(Math.random()*5)+1))*1000;
window.start = function start(){ ... };
startTime = new Date();