неожиданный вызов функции в Javascript - PullRequest
0 голосов
/ 24 января 2010

Я не очень хорош в 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>

Вопросы:

Я ожидал, что тогда 'surprise! first function with one parameter' будет предупрежден о нагрузке, поскольку я вызываю функцию только с одним параметром. К моему удивлению, он предупрежден во второй функции.

  • Может кто-нибудь объяснить мне, почему?
  • и как мне обойти это?

Ответы [ 6 ]

8 голосов
/ 24 января 2010

Javascript не поддерживает перегрузку методов; Он просто перезаписывает функцию, поэтому последний будет вызываться каждый раз.

Чтобы обойти это, просто сделайте 1 функцию и поместите туда некоторые условия для проверки, установлены ли переменные.

2 голосов
/ 24 января 2010

Вы объявляете дважды функциональный тест. Второе заменит первое определение.

1 голос
/ 24 января 2010

В JavaScript перегруженные функции не допускаются. поэтому в этом случае вторая функция переопределяет первую, и поэтому вы всегда видите этот результат.

Чтобы обойти это, проверьте значения параметров:

function test(one,two)<br/> {<br/> if(two)<br/> alert('expected: second function with two parameters');<br/> else <br/> alert('surprise! first function with one parameter');<br/> }

0 голосов
/ 25 октября 2010

При вызове такой функции:

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";
   }
   ...
}
0 голосов
/ 24 января 2010

Ах, Javascript не делает полиморфизм подобным образом. У него есть коллекция аргументов, в которую вы можете заглянуть, а затем сделать все правильно, учитывая данные ..

такие вещи, как:

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)) 
0 голосов
/ 24 января 2010

В javascript параметры для функции не обязательны. Вы хотели бы проверить, является ли параметр неопределенным, прежде чем его использовать.

Если использовать это раньше для реализации функциональности типа getter / setter в javascript, подобном следующему:

var _pageSize;

function pageSize(value) {
    if (value) {
       _pageSize = value;
    }
    else {
       return _pageSize;
    }
}

Затем вы можете использовать метод pageSize для получения и установки размера страницы, как показано ниже:

if (pageSize() < 15) {
    pageSize(15)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...