JavaScript cтранное поведение функции

  function func(el) {
    console.log(el)
  }
  function test() {
    let aa = func($('#el1')) && func($('#el2')) && func($('#el3'))
}

Этот код выполняется у меня таким образом, что функция func всегда получает один и тот же элемент el1. Если же выполнить так как здесь:

a = func($('#el1')) 
b = func($('#el2')) 
c = func($('#el3'))
aa = a && b && c

то всё ок. Почему такое поведение?


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

Автор решения: Andrey Shevchenko

А что возвращает function func(el)? undefined?

Если так, то здесь: func($('#el1')) && func($('#el2')) && func($('#el3')) вторая и третья часть даже не будут запускаться, так как результат первой == false и нет смысла запускать что-то дальше, что связано через &&

→ Ссылка
Автор решения: Aziz Umarov

Дам несколько цитат отсюда

Короткий цикл вычислений

JavaScript вычисляет несколько ИЛИ слева направо. При этом, чтобы экономить ресурсы, используется так называемый «короткий цикл вычисления».

Допустим, вычисляются несколько ИЛИ подряд: a || b || c || .... Если первый аргумент – true, то результат заведомо будет true (хотя бы одно из значений – true), и остальные значения игнорируются.

Это особенно заметно, когда выражение, переданное в качестве второго аргумента, имеет сторонний эффект – например, присваивает переменную.

Оператор И пишется как два амперсанда &&:

К И применим тот же принцип «короткого цикла вычислений», но немного по-другому, чем к ИЛИ.

Если левый аргумент – false, оператор И возвращает его и заканчивает вычисления. Иначе – вычисляет и возвращает правый аргумент.

Например:

// Первый аргумент - true,
// Поэтому возвращается второй аргумент
alert( 1 && 0 ); // 0
alert( 1 && 5 ); // 5

// Первый аргумент - false,
// Он и возвращается, а второй аргумент игнорируется
alert( null && 5 ); // null
alert( 0 && "не важно" ); // 0

Прменительно к вашему примеру

let aa = func($('#el1')) && func($('#el2')) && func($('#el3'))

а также

aa = a && b && c

выполняются по короткому циклу. А вот само вычисление

a = func($('#el1')) 
b = func($('#el2')) 
c = func($('#el3'))

выполниться по любому потому что оно так запрограммировано

→ Ссылка