Это серия утверждений на самом деле
popup_window != is_null // if true, continue to the statement in the parenthesis
&&
(
"function" == typeof popup_window.close // if true continue to close the window
&&
popup_window.close()
, popup_window = is_null // this is executed as long as "popup_window != is_null"
); // is truthy, it doesn't depend on the other conditions
предполагая, что is_null
на самом деле null
, во-первых, popup_window
не должно быть нулевым.
Во-вторых, мы можем предположить, что popup_window
— это другое окно, открытое с помощью window.open
, поскольку оно предположительно должно иметь функцию close
, и это немного похоже на условие Йоды, но это также может быть написано
typeof popup_window.close === "function"
поэтому popup_window
должен иметь метод close
, чтобы перейти к следующему шагу. Последний шаг закрывает всплывающее окно, если оно не пустое и если оно имеет метод close
.
popup_window.close()
поэтому два других условия должны быть истинными, чтобы зайти так далеко, должно быть окно, и у него должен быть метод close
, а затем вызывается этот метод close
, и окно закрывается.
А тут запятая. Из документов
Оператор запятой оценивает каждый из своих операндов (слева направо) и возвращает значение последнего операнда.
и у нас есть
("function" == typeof popup_window.close && popup_window.close(), popup_window = is_null);
давайте немного по другому напишем
( // ↓ must be thruthy .... ↓ for this to execute
(typeof popup_window.close === "function" && popup_window.close())
, popup_window = is_null
); // ↑ unrelated, it's just another operand, seperated by comma
Хитрость здесь в том, что всегда выполняется последняя часть после запятой, так как оцениваются все операнды, разделенные запятой.
Это означает, что если popup_window
не равно is_null
, popup_window
явно устанавливается равным is_null
, независимо от второго условия.
Второе условие также выполняется только в том случае, если popup_window
не является is_null
, затем проверяется, есть ли метод close()
, и закрывается окно, оператор после запятой не связан с результатом этого условия.
Чтобы написать это еще проще (так, как это должно было быть написано IMO)
if ( popup_window != is_null ) {
if ( typeof popup_window.close === "function" ) {
popup_window.close();
}
popup_window = is_null;
}
person
adeneo
schedule
10.02.2015
window.close()
возвращает истину (он возвращает всплывающее окно, если один существует), переменнаяpopup_window
имеет значениеis_null
, что, вероятно, равноnull
, исходя из оператора. - person adeneo   schedule 11.02.2015if ( truthy && falsy && truthy )
, последний никогда не проверяется, так как второй ложный, и тут же дает сбой. - person adeneo   schedule 11.02.2015