OldSchool1705
@OldSchool1705
I want to become a programmer

Если true выводит false а если false выводит true замыкание, что не так?

function toggleMe (){
    var a = 0;
    return function(){
        if(a =true){
            a = false;
            
           
        }else if (a =false) { 
            
            a =true;
        }
     
     
     return  a;
    }
    }
var a = toggleMe();
var  b= a();
console.log(b);
console.log(b);
  • Вопрос задан
  • 692 просмотра
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Давайте разберем все по строчкам, что Вы тут понаписали:
function toggleMe() {
  // я кажется начинаю понимать ОТ кого придумали typescript...
  var a = 0; // если логика подразумевает логический тип, зачем init-значение число?
  return function() {
    if(a = true) { // это условие всегда будет истинно, независимо от a, в a сохраним значение true
      a = false;
    } else if (a = false) { // в принципе тоже что и выше, но еще этот код не достижим
      a = true;
    }
    return a;
  }
}
var a = toggleMe(); // в a извлекли функцию с замыканием
var b = a(); // в b будет false
console.log(b);
console.log(b); // а второй лог что-то меняет? нет

Теперь давайте посмотрим, что произойдет, когда данный код попадет в современный движок JS:
1.
function toggleMe() {
  var a = 0;
  return function() {
    if(a = true) {
      a = false;
    } else a = false /* удаляем недостижимый код if (a = false) {
      a = true;
    } */
    return a;
  }
}

2.
function toggleMe() {
  var a = 0;
  return function() {
    a = true
    a = false;
/* этот if разворачивается однозначно
    if(a = true) {
      a = false;
    } else a = false */
    return a;
  }
}

3.
function toggleMe() {
  var a = 0;
  return function() {
    return false;
/* незачем это вычислять каждый раз, все и так однозначно
    a = true
    a = false;
    return a; */
  }
}

4.
// если вызвать этот код несколько раз:
var a = toggleMe();
var b = a();
console.log(b);
console.log(b);

// то оптимизатор в конце концов сократит его до
console.log(false);
console.log(false);
// а функцию выкинет совсем


P.S. возможно имелось в виду это:
function toggleMe() {
  var a = false;
  return function() {
    return a = !a;
  };
}

var b = toggleMe();
console.log(b());
console.log(b());
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@mikutsky
Вот что не так:
Замыкание почти рабочее.
В условии Вы используете "=" - это оператор присвоения, нужно использовать оператор сравнения "==" - нестрогое или "===" - строгое. И много лишнего кода. Это простейший случай, можно в одну строчку уместить.
Вызываете функцию тоже совсем не верно!

Вызов функции должен происходить перед каждым выводом результата в консоль, иначе значение не будет меняться на противоположное.

Вот мои замечания к Вашему коду:
function toggleMe (){
    var a = 0; //я бы сразу задал булевое значение,
                   //например false;

    return function(){

//можно обойтись без if, сразу присвоить
//переменной а, противоположное значение
//и вернуть, как-то так: return a=!a;

        if(a =true){ //если хочется if, проверку
                          //равенства делают так if(a==true)
                          //или ещё проще, тут: if(a)
            a = false;

        }else if (a =false) { //этот if вообще не нужен

            a =true;
        }

     return  a;
    }
    }
var a = toggleMe();
var  b= a(); //вы присваивание результат
                  //выполнения функции переменной b,
                  //чтобы значение b менялось,
                  //функцию нужно вызывать заново,
                  //Можно так b=a(); и b выводить,
                  //Но лучше сразу выводить a()
console.log(b);
console.log(b);


Функцию с одним действием, можно записать в стрелочной форме.
Вот лаконичная реализация:
function toggleMe(){
  let a = false;
return () => a = !a;
}

const a = toggleMe();

console.log(a()); //true
console.log(a()); //false
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы