Перегрузка / перезапись функций JavaScript - PullRequest
0 голосов
/ 27 июня 2018

я пытаюсь понять

function test() {
  return 'foo';
}

console.log(test());

test = function() {
  return 'bar';
}

console.log(test());

function test(a, b) {
  return 'baz';
}

console.log(test());
console.log(test(true));
console.log(test(1, 2));

вышеуказанный код, который утешает

Баз
бар
бар
бар
бар

Но, поскольку JavaScript был однопоточным языком и концепцией перегрузки функций, я ожидал

Foo
бар
бар
Баз
Баз

Может ли кто-нибудь объяснить, почему это происходит?

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Да. Я думаю, что происходило следующее:

  1. Функции, объявленные с function test(...) { ... }, поднимаются в верхнюю часть текущей области. Таким образом, оба определения вашей функции, использующие этот синтаксис, были подняты наверх, но второе определенное значение переписало первое, что привело к результату «baz.»

  2. Функциональные выражения не отображаются, например test = function (...) {...}. Поэтому, когда вы переназначали идентификатор test для этого выражения функции, он стал значением для test для оставшейся части вашего сценария.

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

Если вы хотите избежать подъема, используйте let myFn = function (...) { ... }.

Вот строка за строкой, насколько я понимаю:

// `test` defined with func declaration, hoisted to top
function test() {
  return 'foo';
}

console.log(test);
console.log(test());

// `test` overwritten with function expression, hoisting has already occurred,
// `test` identifier will have this value for remainder of script
test = function() {
  return 'bar';
}

console.log(test);
console.log(test());

// `test` overwritten with new func declaration, hoisted to top, but after first declaration
function test(a, b) {
  return 'baz';
}

console.log(test);
console.log(test());
console.log(test(true));
console.log(test(1, 2));
0 голосов
/ 27 июня 2018

Шаг за шагом:

function test() {
  return 'foo';
}

Это объявление функции. Переменная test объявляется при интерпретации до выполнения.

test = function() {
  return 'bar';
}

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

function test(a, b) {
  return 'baz';
}

Это еще одно объявление функции. Переменная test перезаписывается снова перед выполнением.

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

Подробнее об объявлении функций и выражениях функций.

0 голосов
/ 27 июня 2018

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

function test(a, b) {
  if(b)
     return 'baz';
  return 'foo';
}
...