Если вы используете имя функции без скобок, она не вызывает функцию, она дает вам ссылку на функцию. Действительно простой пример:
function f1() { alert("hi"); }
var f2 = f1; // This doesn't call the f1 function, it takes a reference
// to it and assigns it to f2.
f2(); // Can call f2 since it refers to the same function; alerts "hi"
Вы можете видеть, что имена функций - это на самом деле просто переменные, которые содержат ссылки на функции, а не на строки, числа или что-то еще, что, возможно, станет еще более очевидным, если вы определите такую функцию:
var f3 = function() { alert("hello") };
f3(); // "hello"
Итак, с этим фоном, что значит сказать if (someFunctionName)
? В JS выражение считается «правдивым» не только в том случае, если оно имеет логическое значение «истина», но если оно оценивается как непустая строка, ненулевое число или любой объект (даже пустой объект). Пустые строки, ноль, ноль, неопределенный и NaN все "ложные". Это различие между логическим true
и «правдивым» очень важно в JavaScript. JS-функции - это тип объекта. Итак:
if (someFunctionName)
// is testing if someFunctionName is "truthy" and is a shortcut way of saying
if (someFunctionName != undefined)
// also equivalent to
if (typeof someFunctionName != "undefined")
Второй пример, о котором вы спрашиваете, if(d.getElementById)
, - это проверка того, что объект d
(для которого установлено значение document
) имеет метод с именем getElementById
. В общем смысле это потому, что давным-давно не все браузеры поддерживали этот метод, поэтому этот код был предназначен для того, чтобы код мог работать во всех браузерах без ошибок. На практике document.getElementById()
поддерживается по крайней мере со времен IE5, поэтому этот тест является избыточным.
Первый пример, о котором вы спрашивали, все еще актуален, поскольку IE8 и старше не поддерживают window.addEventListener
. Итак, код:
window.addEventListener ? window.addEventListener("load",so_init,false)
: window.attachEvent("onload",so_init);
использует троичный оператор ? :
, чтобы проверить, определено ли window.addEventListener
. Если это так, он вызывает его, в противном случае он вызывает window.attachEvent
(что является старым эквивалентом IE). Все современные браузеры поддерживают один или другой.