0

В 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).
  • https://developer.mozilla.org/ru/docs/Glossary/IIFE – u_mulder Sep 07 '21 at 11:11
  • 1
    где тут три выражения? можете пояснить? а то сложно понять за этой однострочной кашей – Алексей Шиманский Sep 07 '21 at 11:12
  • to @u_mulder спасибо за ссылку, но я ни там, ни в других местах не нашел объяснения, как анонимное функциональное выражение работает с параметрами. – Noname Noferstname Sep 07 '21 at 11:23
  • 1
    (function(x) { return (x | 0) === x; })(parseFloat( val)) значит что в качестве аргумента x передается результат parseFloat( val). – u_mulder Sep 07 '21 at 11:26
  • to @АлексейШиманский Я вообще не могу понять, что там и как это работает. Почему то там в условии if() сначала (function(x) { return (x | 0) === x; }), потом без всяких операторов сразу (parseFloat( val)) === (function(x) { return (x | 0) === x; }), а потом так же ещё и (parseFloat(String( id(fullScale_0).value))). – Noname Noferstname Sep 07 '21 at 11:27
  • to @u_mulder т.е. там сравнивается (function(x) { return (x | 0) === x; })(parseFloat( val)) с (function(x) { return (x | 0) === x; })(parseFloat(String( id(fullScale_0).value)))? – Noname Noferstname Sep 07 '21 at 11:29

1 Answers1

3

Откуда берётся значение "х" в функциональных выражениях 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( СЮДА )
  • и затем результат передастся в самовызывающуюся функцию