Переопределение функций
Функции обладают возможностью для переопределения поведения. Переопределение происходит с помощью присвоения анонимной функции переменной, которая называется так же, как и переопределяемая функция:
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
.