我是node.js的初学者,我一直在研究一个简单的立方体计时器,但不幸的是,有些东西不起作用。在app.get中,当我运行sumOfSeconds(最好)时,会发生错误,告诉我有趣(sumOfSolves中的最后一行)不是函数。但是,当我尝试在app.get之外运行sumOfSeconds时(我也将更改返回到console.log以便我可以看到结果)一切正常。问题是什么? 在此先感谢;)
var sumOfSolves = [];
//create an array of total seconds in each time - used for Ao5, Ao12, best and worst
function sumOfSeconds(fun){
Time.find({}, function(err, data){
if(err) throw err;
sumOfSolves = [];
for(var i = 0; i < data.length; i++){
sum = data[i].min * 60 + data[i].sec;
sumOfSolves.push(sum);
}
fun(); //this makes best(), worst(), Ao5(), Ao12 execute after sumOfSeconds finished everything else,
//otherwise those functions run before the sumOfSolves array had something in ot and therefore the code didn't work
})
}
function best(){
var best = Math.min(...sumOfSolves);
var position = sumOfSolves.indexOf(best);
Time.find({}, function(err, data){
if(err) throw err;
var bestTime = data[position].time;
return bestTime
})
}
function worst(){
var worst = Math.max(...sumOfSolves);
var position = sumOfSolves.indexOf(worst)
Time.find({}, function(err, data){
if(err) throw err;
var worstTime = data[position].time;
return worstTime;
})
}
function Ao5(){
}
function Ao12(){
}
module.exports = function(app){
app.get('/', function(req, res){
var best = sumOfSeconds(best);
var worst = sumOfSeconds(worst);
Time.find({}, function(err, data){
if(err) throw err;
res.render('index', {times: data, best: best, worst: worst});
})
});
答案 0 :(得分:2)
您在best
中将worst
和var
声明为app.get
。不要这样做!为与函数声明不冲突的变量选择唯一的名称。
编辑: Javascript中的范围与任何其他语言一样重要,可能更多,因为整个脚本本质上是全局范围(全局范围可以访问嵌套范围中声明的变量)。
此外,几乎所有东西都是JS对象。 (有关6种基本类型,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures。)因此,与允许变量和函数具有相同名称的语言不同,在JS中,只能有一个给定名称的标识符。您“提升”了名称best
和worst
,因此JS引擎使用了您的新定义而不是函数。
如果您希望将来避免出现这类问题,并且不必担心支持旧浏览器,请使用let
代替var
。 let
警告你要提升。
此外,至少在开发期间,将:"use strict";
放在源文件的顶部。