Как работает инструкция If(), если в качестве условия в нём есть несколько выражений?

В JS-коде имеется такая функция:

function checkVal( num) {
    var val = id('me' + num).value;
    if(isNaN( val ))
        alert(val  + ' не является числом.') 
    else {
        if((function(x) { return (x | 0) === x; })(parseFloat( val)) === (function(x) { return (x | 0) === x; })(parseFloat(String( id(fullScale_0).value))))
            alert('Не верный формат.' + val )
        else
            id('regReading_' + num).value = val;
    }
}

Код работает, но я не понимаю логику условия во вложенной инструкции if(). А именно:

  1. Почему три логических выражения в условии перечислены без всяких разделителей или логических операторов;
  2. Откуда берётся значение "х" в функциональных выражениях function(x).

Ответы (1 шт):

Автор решения: Алексей Шиманский

Откуда берётся значение "х" в функциональных выражениях function(x).

Функция объявляется и сразу вызывается. Такое можно делать с функциями

  (function(arg) {
      alert(arg);
  })(666);
//  ^^^^^ сразу вызвали с переданным аргументом

Почему три логических выражения в условии перечислены без всяких разделителей или логических операторов;

Если уметь форматировать код то можно заметить следующее

if (

    (function(x) {               |
        return (x | 0) === x;    |  переменная "a"
    })(parseFloat(val))          |
    
    === 

    (function(x) {                                  |
        return (x | 0) === x;                       | переменная "b"
    })(parseFloat(String(id(fullScale_0).value)))   |

)

В итоге сводится всё к if (a === b), т.к. говорилось выше, что функции сразу выполняются и получают результат своих действий.


Единственно, в самой последней функции в качестве аргумента поступает не "чистый" аргумент, а результат выполнения другой функции, у которой в качестве аргумента идёт ещё одна функция. И получается некая матрёшка:

  • выполнится самая первая id(fullScale_0).value)
  • затем её результат передастся в функцию String( СЮДА )
  • дальше результат выполнения передастся в parseFloat( СЮДА )
  • и затем результат передастся в самовызывающуюся функцию
→ Ссылка