Javascript中对函数的意外调用

Javascript中对函数的意外调用,javascript,javascript-events,Javascript,Javascript Events,我不太擅长javascript,所以我在这里问 下面是一个示例代码 <html> <head> <script> function test(one) { alert('surprise! first function with one parameter'); } function test(one,two) { alert('expected: second function with two parameters'); } </script>

我不太擅长javascript,所以我在这里问

下面是一个示例代码

<html>
<head>
<script>
function test(one)
{
alert('surprise! first function with one parameter');
}

function test(one,two)
{
alert('expected: second function with two parameters');
}
</script>
</head>
<body onload="javascript:test('first')">
</body>
</html>

功能测试(一)
{
警报(“惊喜!第一个带一个参数的函数”);
}
功能测试(一、二)
{
警报('预期:第二个函数有两个参数');
}
问题:

我原以为那是个惊喜!第一个带有一个参数“的函数将在加载时发出警报,因为我只使用一个参数调用该函数。令我惊讶的是,它在第二个函数中发出了警报

  • 谁能给我解释一下为什么
  • 我怎样才能绕过它呢

    • Javascript不支持方法重载; 它只是覆盖函数,因此每次都会调用最后一个函数


      解决这个问题的一种方法就是创建一个函数,并在其中添加一些条件来检查变量是否已设置。

      在javascript中,函数的参数不是必需的。在使用该参数之前,您需要检查该参数是否未定义

      如果之前使用此选项是为了在javascript中实现getter/setter类型功能,如下所示:

      var _pageSize;
      
      function pageSize(value) {
          if (value) {
             _pageSize = value;
          }
          else {
             return _pageSize;
          }
      }
      
      然后,您可以使用pageSize方法获取和设置页面大小,如下所示:

      if (pageSize() < 15) {
          pageSize(15)
      }
      
      if(pageSize()<15){
      页面大小(15)
      }
      
      啊,Javascript不会这样做。它确实有一个arguments集合,您可以查看该集合,然后在给定输入的情况下执行正确的操作

      比如:

      function calcAverage() 
      { 
         var sum = 0 
         for(var i=0; i<arguments.length; i++) 
            sum = sum + arguments[i] 
         var average = sum/arguments.length 
         return average 
      } 
      document.write("Average = " + calcAverage(400, 600, 83)) 
      
      函数calcAverage()
      { 
      var总和=0
      
      对于(var i=0;i您声明了两次函数测试。第二个函数覆盖了第一个定义。

      在JavaScript中,重载函数是不允许的。因此在这种情况下,第二个函数覆盖了第一个函数,因此您总是可以看到这个结果

      解决方法是检查参数值:

      功能测试(一、二)
      {
      如果(两个)
      警报('expected:second function with two parameters');
      否则
      警报(‘惊奇!第一个带有一个参数的函数’;

      }

      调用此函数时:

      function test(one,two)
      
      只有一个参数时,参数“two”将具有特殊类型:undefined。 任何访问变量two的尝试都将失败,并出现“two is undefined”错误,为避免此类错误,请使用typeof命令:

      function test(one,two)
      {
         if (typeof two == "undefined") {
            //give default value
            two = "default value here";
         }
         ...
      }