Загрузка данных
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Практическая №24 - Исправление ошибки</title>
</head>
<body>
<h1>Исправление ошибки в коде (Вариант B)</h1>
<script type="text/javascript">
// ==============================================
// ИСХОДНЫЙ КОД С ПРОБЛЕМОЙ
// ==============================================
console.log("=== ИСХОДНЫЙ КОД ===");
function showOriginal(n) {
if (n < 10) {
var result = "Mano";
}
console.log(result); // Проблема: обращение к переменной, которая может быть не определена
}
console.log("Вызов show(5):");
showOriginal(5); // Выведет "Mano"
console.log("\nВызов show(20):");
showOriginal(20); // Выведет "undefined"
// ==============================================
// ОБЪЯСНЕНИЕ ПРОБЛЕМЫ
// ==============================================
console.log("\n\n=== ОБЪЯСНЕНИЕ ПРОБЛЕМЫ ===");
console.log("Проблема: переменная 'result' объявлена с помощью 'var' внутри блока if.");
console.log("Особенности 'var':");
console.log("1. Поднимается (hoisting) в начало функции");
console.log("2. Имеет функциональную область видимости");
console.log("3. До присваивания имеет значение 'undefined'");
console.log("\nКогда вызывается show(20):");
console.log("- Условие (n < 10) ложно (20 < 10 = false)");
console.log("- Блок if не выполняется");
console.log("- Переменная 'result' существует (благодаря hoisting), но равна 'undefined'");
console.log("- console.log(result) выводит 'undefined'");
// ==============================================
// СПОСОБ 1: Инициализация переменной перед условием
// ==============================================
console.log("\n\n=== СПОСОБ 1: Инициализация переменной ===");
console.log("Исправление: объявить и инициализировать переменную ДО условия");
function showFixed1(n) {
var result = ""; // Инициализируем пустой строкой
if (n < 10) {
result = "Mano";
}
console.log("При n = " + n + ": result = '" + result + "'");
}
showFixed1(5);
showFixed1(20);
// ==============================================
// СПОСОБ 2: Использование let с правильной областью видимости
// ==============================================
console.log("\n\n=== СПОСОБ 2: Использование let ===");
console.log("Исправление: использовать 'let' с проверкой существования");
function showFixed2(n) {
if (n < 10) {
let result = "Mano"; // result существует только внутри блока
console.log("При n = " + n + ": result = '" + result + "'");
} else {
console.log("При n = " + n + ": условие не выполнилось, result не определен");
}
}
showFixed2(5);
showFixed2(20);
// ==============================================
// СПОСОБ 3: Возврат значения из функции
// ==============================================
console.log("\n\n=== СПОСОБ 3: Возврат значения из функции ===");
console.log("Исправление: использовать return для возврата значения");
function showFixed3(n) {
if (n < 10) {
return "Mano";
}
return "Число больше или равно 10";
}
console.log("При n = 5: " + showFixed3(5));
console.log("При n = 20: " + showFixed3(20));
// ==============================================
// СПОСОБ 4: Использование значения по умолчанию
// ==============================================
console.log("\n\n=== СПОСОБ 4: Значение по умолчанию ===");
console.log("Исправление: использовать значение по умолчанию при выводе");
function showFixed4(n) {
var result;
if (n < 10) {
result = "Mano";
}
// Используем значение по умолчанию, если result undefined
console.log("При n = " + n + ": " + (result || "Значение не установлено"));
}
showFixed4(5);
showFixed4(20);
// ==============================================
// ИТОГОВОЕ ИСПРАВЛЕНИЕ (рекомендуемое)
// ==============================================
console.log("\n\n=== ИТОГОВОЕ ИСПРАВЛЕНИЕ ===");
console.log("Самый простой и читаемый способ:");
function show(n) {
let result; // Объявляем переменную в начале функции
if (n < 10) {
result = "Mano";
} else {
result = "Число больше или равно 10";