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 шт):
А что возвращает function func(el)? undefined?
Если так, то здесь: func($('#el1')) && func($('#el2')) && func($('#el3'))
вторая и третья часть даже не будут запускаться, так как результат первой == false и нет смысла запускать что-то дальше, что связано через &&
Дам несколько цитат отсюда
Короткий цикл вычислений
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'))
выполниться по любому потому что оно так запрограммировано