Переопределение функций
Функции обладают возможностью для переопределения поведения. Переопределение происходит с помощью присвоения анонимной функции переменной, которая называется так же, как и переопределяемая функция:
function display(){
console.log("Доброе утро");
display = function(){
console.log("Добрый день");
}
}
display(); // Доброе утро
display(); // Добрый день
При первом срабатывании функции действует основной блок операторов функции, в частности,
в данном случае выводится сообщение "Доброе утро". И при первом срабатывании функции display также происходит ее переопределение. Поэтому при всех последующих вызовах функции срабатывает ее переопределенная версия, а на консоль будет выводиться сообщение "Добрый день".
Но при переопределении функции надо учитывать некоторые нюансы. В частности, попробуем присвоить ссылку на функцию переменной и через эту переменную вызвать функцию:
function display(){
console.log("Доброе утро");
display = function(){
console.log("Добрый день");
}
}
// присвоение ссылки на функцию до переопределения
var displayMessage = display;
display(); // Доброе утро
display(); // Добрый день
displayMessage(); // Доброе утро
displayMessage(); // Доброе утро
Здесь переменная displayMessage получает ссылку на функцию display до ее переопределения.
Поэтому при вызове displayMessage() будет вызываться непереопределенная версия функции display.
Но допустим, мы определили переменную displayMessage уже после вызова функции display:
display(); // Доброе утро display(); // Добрый день var displayMessage = display; displayMessage(); // Добрый день displayMessage(); // Добрый день
В этом случае переменная displayMessage будет указывать на переопределенную версию функции display.