Я должен сделать «JS-программу для извлечения первой половины строки четной длины». Я пытался сделать это так:

function check(string) {
    if(string.length % 2 == 0) {
        const x = (string.length/2);
    }
    else {
        const x = (string.length/2)-1;
    }
    const string2 = string.substring(0, x);
}

check("JavaScript");

Но я получаю x is not defined. В чем дело?

0
f0rta 23 Фев 2018 в 22:21

4 ответа

Лучший ответ
  • Ваша переменная const x находится вне области видимости, потому что заключена в блок if-else.
  • Объявите эту переменную как var или let
function check(string) {
  let x;
  if (string.length % 2 == 0) {
    x = (string.length / 2);
  } else {
    x = (string.length / 2) - 1;
  }
  const string2 = string.substring(0, x);
  console.log(string2)
}

check("JavaScript");
3
Ele 23 Фев 2018 в 19:24

Объявите в области видимости функции, используя let, чтобы впоследствии можно было присвоить значение переменной в выражениях if/else:

function check(string) {
  let x;

  if (string.length % 2 == 0) {
    x = (string.length / 2);
  } else {
    x = (string.length / 2) - 1;
  }

  return string.substring(0, x);
}

const half = check("JavaScript");

console.log(half);

Кроме того, вы можете сжать if/else в троичный оператор и по-прежнему использовать const:

function check(string) {
  const x = string.length % 2 == 0
    ? (string.length / 2)
    : (string.length / 2) - 1;

  return string.substring(0, x);
}

const half = check("JavaScript");

console.log(half);

Обновить

Вы не хотите инициализировать x без предварительного объявления его с помощью let или var, в противном случае он будет неявно определен как глобальный в нестрогом режиме или не выдаст ошибку в строгом режиме :

Не строгий режим

function test () {
  // non-strict mode
  x = 5;
}

test();

console.log(window.x);

Строгий режим

function test () {
  'use strict';
  x = 5;
}

test();

console.log(window.x);
0
Patrick Roberts 23 Фев 2018 в 19:43

Как я уже говорил в комментариях, const имеет область видимости блока, поэтому переменная x неизвестна за пределами блока, в котором она объявлена.

В качестве альтернативы другим решениям вы все равно можете использовать const при условии, что вы используете более умное выражение (которое также исправляет проблему со вторым выражением):

const x = (string.length - string.length % 2) / 2;
0
trincot 23 Фев 2018 в 19:27

На вашу проблему "x is undefined" ответили другие.

Поэтому я просто скажу, что вам не нужно выполнять вычисления двумя разными способами. Кажется, вы хотите, чтобы нечетные числа были округлены в меньшую сторону. Поэтому вы можете использовать:

x = Math.floor(string.length / 2);

  • Math.floor () = округлить
  • Math.ceil () = округлить
  • Math.round () = округлить до ближайшего целого числа

Вероятно, вам также следует return результат, а не просто присвоить его другой строке:

return string.substring(0, x);

0
Raith 23 Фев 2018 в 19:28