Странное поведение при вызове функции - PullRequest
2 голосов
/ 09 февраля 2010

При вызове функции Javascript кажется, что JS сначала отдает приоритет функциям без параметров, даже если у меня такое же имя функции с параметрами. Странное поведение происходит только в следующем сценарии:

У меня есть HTML-страница со встроенным Javascript, например:

 //Javascript in the page  
 function testAbc(){
       alert('testAbc no params');
 }

 //Javascript in common.js
 function testAbc(x){
      alert('testAbc with param:'+x);
 }
 function testAbcFunc(x){
      testAbc(x);
 }

Теперь откуда-то на странице я звоню testAbcFunc из common.js, ожидая, что он вызовет testAbc с параметром, который является общей функцией. Но как ни странно, JS вызывает функцию на исходной странице без параметров !!

Я отлаживал эту ошибку несколько часов назад, и я попробовал этот короткий код, чтобы воспроизвести ошибку, это происходит каждый раз.

ПРИМЕЧАНИЕ: если все функции находятся на одной странице, будет вызвана правильная функция (с параметрами), но когда они разделены между страницей и файлом JS. JS, кажется, отдает приоритет функции на странице , хотя у нее нет параметра

Ответы [ 3 ]

5 голосов
/ 09 февраля 2010

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

4 голосов
/ 09 февраля 2010

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

Так что просто не делайте этого, проверьте количество параметров с arguments.length внутри функции и не пытайтесь использовать перегрузку, которая никогда не сработает.

function testAbc(){
   if (arguments.length == 0) {
       alert('testAbc no params');
   } else {
       var x = arguments[0];
       alert('testAbc with param:'+x);
   }
}
1 голос
/ 09 февраля 2010

В JavaScript нет перегрузки функций. Если вы определяете функцию с двумя значениями с различным количеством параметров, будет вызван последний из определяемых.

Кроме того, вы должны использовать пространство имен для своего JavaScript.

Вот так:

var common = {
    testABC: function () {
        //Stuff
    }
};

Затем вызовите testABC следующим образом

common.testABC();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...