2016-09-26 7 views
1

У меня есть путаница в вызове функции в javascript, может ли кто-нибудь ответить на вопрос ниже?Вызов функции с конструкторами в javascript

**Question 1:** 
function A(){ 


} 


function A(){ 


} 

A(); 

В этом случае, какая функция вызовет? Это первая или вторая функция? и почему?

**Question 2:** 
function A(a){ 


} 


function A(a,b){ 


} 

A(); 

В этом случае эта функция вызовет? Это первая или вторая функция? и почему?

Заранее спасибо.

+3

Вторая функция для обоих, поскольку она объявлена ​​и определена после первого объявления. –

+0

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

+0

Существует несколько дубликатов этого типа вопросов. – jfriend00

ответ

5

Давайте положить его в действии и увидеть результаты:

function A(){ 
 
    var el = document.getElementById('test'); 
 
    el.innerText = "First function"; 
 
} 
 

 
function A(){ 
 
    var el = document.getElementById('test'); 
 
    el.innerText = "Second function"; 
 
} 
 

 
A();
<div id="test"></div>

Как мы можем видеть, вторая функция является победителем. Зачем? Потому что, когда мы пишем его снова после первого объявления, мы просто переписываем это действительно.

Что касается второго вопроса:

function A(a){ 
 
    var el = document.getElementById('test'); 
 
    el.innerText = "First function"; 
 
} 
 

 
function A(a,b){ 
 
    var el = document.getElementById('test'); 
 
    el.innerText = "Second function"; 
 
} 
 

 
A();
<div id="test"></div>

Как мы видим, он по-прежнему выполняет второй вопрос. Это потому что javascript не является полиморфным языком, то есть он не может иметь две функции с тем же именем, но с различными объявлениями ввода, такими как java. Мы просто сделали то же самое, что и выше: мы перезаписываем функцию A.

PS: Если javascript был полиморфным языком (которого это не так), то второй запуск будет возвращать ошибку, потому что мы не объявили версию функции A, которая принимает 0 переменных в качестве входных данных.

0

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

Это похоже на письма:

var a = 1; 
var a = 2; 

a === 2; // true 
+0

Это плохая аналогия, потому что объявления функций объявляют и определяют одновременно (подняты), однако объявления переменных ведут себя по-разному, когда они только объявляют об этом, но не определяют его. ([Demo] (https://jsfiddle.net/DerekL/eafjLhLa/) для читателей в будущем) –

+0

Вот почему я пишу, что это похоже, не то же самое. – Christoph

0

Когда анализатор входит в сценарий, он ищет var заявлений и function деклараций, а затем создает эти переменные в текущей области (в вашем случае это глобальная область). Этот процесс поиска и создания называется подъемом. Итак, в вашем случае при анализе объявления первой функции найдено. Итак, что-то подобное происходит:

scope.A = function A(){} // first function 

Затем парсер продолжает поиск и находит другое объявление функции. И то же самое происходит:

scope.A = function A(){} // second function 

Как вы можете видеть, scope.A Теперь ссылки вторую функцию.

2

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

Также нет функции перегрузки в javascript, во втором случае подпись функции изменения (то есть аргументы, которые она принимает) переопределит ту же функцию A (определенную 1-ю).