Javascript未捕获类型错误:不是函数

Javascript未捕获类型错误:不是函数,javascript,typeerror,Javascript,Typeerror,我有一个任务要写一个脚本,它需要用户出生的月份、日期和年份。然后它计算出这个人的年、月、日、小时和分钟数。此外,还应计算到下一个生日的天数。我已经编写了一个名为leapYear()的函数,它通过几个等式来检查年份是否是闰年,并且运行良好,但是如果我尝试在另一个函数中多次调用该函数,我会得到“Uncaught TypeError:leapYear不是函数”。有人能告诉我哪里出了问题吗 提前谢谢 index.html <!DOCTYPE html> <html> &l

我有一个任务要写一个脚本,它需要用户出生的月份、日期和年份。然后它计算出这个人的年、月、日、小时和分钟数。此外,还应计算到下一个生日的天数。我已经编写了一个名为leapYear()的函数,它通过几个等式来检查年份是否是闰年,并且运行良好,但是如果我尝试在另一个函数中多次调用该函数,我会得到“Uncaught TypeError:leapYear不是函数”。有人能告诉我哪里出了问题吗

提前谢谢

index.html

    <!DOCTYPE html>
<html>
<head>
    <title>HTML 5 Template</title>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
    <link rel="stylesheet" href="style.css" type="text/css" />
    <!-- USE ONLY IF using author's modernizr JavaScript file -->
    <script type="text/javascript" src="modernizr.js"></script>
    <!-- USE ONLY IF using external JavaScript file -->
    <script type="text/javascript" src="functions.js"></script>
    <script type="text/javascript">
        <!--  USE ONLY IF using document level JavaScript -->
    </script>
</head>
<body>

    <div id="form">
        <h1>Age Calculator</h1>
        <h2>Enter Your Birthdate:</h2>
        <form method="get" onsubmit="return false">
            <p>
                <label for="day">Day:</label><br>
                <select name="day" id="day">
                    <script> dayList(); </script>
                </select>
            </p>
            <p>
                <label for = "month">Month:</label><br>
                    <select name="month" id="month">
                        <option value="1">January</option>
                        <option value="2">February</option>
                        <option value="3">March</option>
                        <option value="4">April</option>
                        <option value="5">May</option>
                        <option value="6">June</option>
                        <option value="7">July</option>
                        <option value="8">August</option>
                        <option value="9">September</option>
                        <option value="10">October</option>
                        <option value="11">November</option>
                        <option value="12">December</option>
                    </select>
                </p>
                <p>
                    <label for="year">Year:</label><br>
                    <select name="year" id="year">
                        <script> yearList();</script>
                    </select>
                </p>
                <p class="left">
                    <input type="submit" value="Calculate" onclick="ageCalc()">
                    <input type="reset" value="Reset">
                </p>
        </form>
    </div>

    <div id="results">
        <p>
            You've been living for: <br>
            <p id="yearsLived"></p> Years, <br>
            <p id="monthsLived"></p> Months, <br>
            <p id="daysLived"></p> Days, <br>
            <p id="hoursLived"></p> Hours, and <br>
            <p id="minLived"></p> Minutes. <br>
            <p id="daysTillBD"></p> Days till your birthday.
        </p>
    </div>
</body>
</html>

有几件事你做错了

首先,请记住,在JavaScript中,如果您这样做:

leapYear = true;
写入名为
leapYear
全局变量,而不是绑定到当前函数范围的变量。要写入局部变量,您应该

var leapYear = true;
同一函数中该行之后进入
leapYear
的所有赋值和引用都将写入局部变量,而不是全局变量

其次,记住javascript中的函数可以存储到类似于整数或字符串的变量中。因此,在编写
函数leapYear
时,需要声明一个存储函数的变量
leapYear
。当您写入
leapYear=true
时,您将覆盖该变量,而不是它存储布尔值。如果您随后尝试调用
leapYear()
则会出现错误,因为现在
leapYear
存储的是布尔值,而不是函数,布尔值不可调用


因此,要解决您的问题,您可以使用
var
预先设置
leapYear=false
。但是,在您的特定情况下,您可以只删除
leapYear=false
leapYear=true
行,因为您以后不会使用这些值。最后一点注意:如果您的意图是返回该值,那么应该编写
returnfalse而不是
leapYear=false(例如,这是在Delphi中返回值的正确方法)。

您的代码为什么包含同名的de变量函数(leapYear)有问题。更改变量ou函数的名称,然后运行新测试

看看这个例子:

h1{
字体大小:15px;
颜色:蓝色;
文本对齐:居中;
}
氢{
字体大小10px;
文本缩进:150px;
}
形式{
保证金:自动;
宽度:80%;
}
#形式{
宽度:50%;
高度:250px;
保证金:自动;
边框:5px黑色双色;
}
#表格p{
宽度:33%;
文本对齐:居中;
浮动:左;
保证金:0,自动;
}
#左表{
浮动:对;
}
#结果{}

//全局变量
变量日期=新日期();
var currentMin=date.getMinutes();
var currentHour=date.getHours();
var currentDay=date.getDate();
var currentMonth=date.getMonth()+1;
var currentYear=date.getFullYear();
var月={
1: 31,
2: 28,
3: 31,
4: 30,
5: 31,
6: 30,
7: 31,
8: 31,
9: 30,
10: 31,
11: 30,
12: 31
};
//填写日表格数据
函数dayList(){
var计数器=1;
而(计数器=1950){
文件。写(“+计数器+”);
var计数器=计数器-1;
}
};
//检查出生年份是否为闰年
功能leapYearCalc(生日){
var num=(出生年份/4)%1;
变量num2=(出生年份/100)%1;
变量num3=(出生年份/400)%1;
如果(num==0 | |(num2==0&&num3==0)){
daysInYear=366;
月[2]=29;
闰年=真;
}否则{
daysInYear=365;
月[2]=28;
年份=假;
}
};
//年龄计算器
函数ageCalc(){
var birthDay=parseInt(document.getElementById('day').value);
var birthMonth=parseInt(document.getElementById('month').value);
var birthYear=parseInt(document.getElementById('year').value);
var YearsLive=当前年份-出生年份;
var-monthslive=0;
var daysLived=0;
var Hourslive=当前小时;
var minlive=currentMin;
var daysTillBD=0;
var计数=0;
//离生日还有几天
leapYearCalc(当前年度);
如果(出生月<当前月){
daysTillBD=月[currentMonth]-当前日;
var testMonth=当前月份;
while(testMonth!=12){
testMonth++;
daysTillBD=daysTillBD+月[testMonth];
}
var testYear=当前年份+1;
leapYearCalc(测试年);
testMonth=1;
while(testMonth!=生日月){
daysTillBD=daysTillBD+月[testMonth];
testMonth++;
}
daysTillBD=daysTillBD+(生日-1);
}else if(生日月>当前月){
daysTillBD=月[currentMonth]-当前日;
var testMonth=currentMonth+1;
while(testMonth!=生日月){
daysTillBD=daysTillBD+月[testMonth];
testMonth++;
}
daysTillBD=daysTillBD+(生日-1);
}否则{
如果(生日<当前日期){
daysTillBD=月[currentMonth]-当前日;
var testMonth=currentMonth+1;
while(testMonth!=生日和testMonth当前日期){
daysTillBD=生日-当前日期;
}
}
//结果显示
document.getElementById('yearsLived')。innerHTML=yearsLived;
document.getElementById('monthLive')。innerHTML=monthLive;
document.getElementById('daysLived')。innerHTML=daysLived;
document.getElementB
leapYear = true;
var leapYear = true;