Блок область в ES5 - PullRequest
       49

Блок область в ES5

0 голосов
/ 20 мая 2019

У меня проблема с заданием.Это назначение:

При заданной следующей функции.

let rechne = function(x,y,operation) {
  let ergebnis = x - y;
  if (!operation) {
    let ergebnis = x + y;
    console.log(ergebnis);
  }
  return ergebnis;
}

Перепишите функцию, чтобы в ES5 можно было достичь желаемой области блока переменных..

Итак, я написал это:

 let rechneScope = function(x,y,operation) {
   (function(){
     let ergebnis = x - y;
   })()

   if (!operation) {
     (function(){
       let ergebnis = x + y;
       console.log(ergebnis);
     })()
   }

   return ergebnis;
}

Предполагается, что я вызвал эту функцию в файле console.log наподобие console.log(rechneScope(10, 2)) Я бы ожидал, что первая переменная будет 8, а втораяодин должен быть 12.

Но когда я перезагружаю браузер, консоль всегда печатает 12 для второй переменной и для первой переменной результат отличается.Иногда 2, иногда 8, иногда 15. Я действительно смущен.Почему это происходит?

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Сначала вы предполагаете, что желаемый результат равен 8, тогда 12 неверен. Первый console.log, который будет выполнен, это тот, который имеет ergebnis = x + y, поэтому вы должны увидеть 12, затем 8.

Далее, let была введена в ES6, поэтому, если вы ограничиваете себя ES5, вы можете использовать только var.

Наконец, убедитесь, что вы обернули всю область действия каждой переменной в IIFE. У вас есть return ergebnis вне первой функции, так что переменная больше не будет находиться в области видимости во время выполнения строки кода.

Правильная реализация будет выглядеть примерно так:

var rechneScope = function(x, y, operation) {
  return (function() {
    var ergebnis = x - y;
    if (!operation) {
      (function() {
        var ergebnis = x + y;
        console.log(ergebnis);
      })()
    }
    return ergebnis;
  })()
}

console.log(rechneScope(10, 2))

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

"use strict";

var rechne = function rechne(x, y, operation) {
  var ergebnis = x - y;

  if (!operation) {
    var _ergebnis = x + y;

    console.log(_ergebnis);
  }

  return ergebnis;
};
0 голосов
/ 20 мая 2019

Вы делаете незначительные ошибки.

  1. Вы используете ключевое слово let, которое заботится о области действия и из-за этого ваш «эргебнис» не определен взамен.
  2. Вы не печатаете вывод в первом блоке.

Решение состоит в том, чтобы удалить оператор возврата и распечатать ответ в каждом блоке. Вы получите желаемый результат

let rechneScope = function(x,y,operation) {
   (function(){
     let ergebnis = x - y; 
     console.log(ergebnis);
   })()

   if (!operation) {
     (function(){
       let ergebnis = x + y;
       console.log(ergebnis);
     })()
   }
}
rechneScope(10, 2);
...