почему вызов функции не работает таким образом? - PullRequest
0 голосов
/ 13 сентября 2011

Это скрипт, который я тестировал при загрузке страницы.

window.onload = initAll;

function initAll() {
document.getElementById("pTag").innerHTML = "Hello Java Script !";
}

Вышеописанный скрипт работает нормально, пока я не поставлю круглые скобки, как initAll() во время call. _( window.onload=initAll(); )_. Ничего не происходит, если использовать initAll() во время вызова функции. Как будто сценария там не было.

Почему это так?

Ответы [ 6 ]

3 голосов
/ 13 сентября 2011

window.onload ожидает, что значение, которое вы установили для него, является функцией (функции похожи на любой другой объект в JavaScript).

Если вы ставите парены после initAll, вы фактически вызываете функции и установите window.onload на возвращаемое значение функции.Поскольку функция return ничего не делает явно, это значение равно undefined.Таким образом, на практике вы можете думать об этом коде:

window.onload = initAll();

function initAll() {
    // do something with document
}

как эквивалентном коду:

var result = initAll();
window.onload = result;

function initAll() {
    return null;
}

Я уверен, что вы сразу увидите, почему это не сработает.

0 голосов
/ 13 сентября 2011

Когда вы опускаете скобки в этом вызове:

window.onload = initAll;

Вы присваиваете событию window.onload эталонное значение функции initAll(). Это заставляет функцию выполняться при вызове события onload, потому что они используют одну и ту же контрольную точку. Когда вы используете назначение, как это:

window.onload = initAll();

Вы присваиваете событию window.onload возвращаемое значение функции, которое в этом случае равно нулю.

0 голосов
/ 13 сентября 2011
window.onload = initAll;

Вы связываете функцию initAll с событием onload объекта window. Функция становится обработчиком нагрузки. Теперь, когда событие load срабатывает на объекте window, эта функция будет вызвана.


window.onload = initAll();

Вы немедленно вызываете функцию initAll. этот вызов возвращает undefined (в вашем случае), и это значение undefined будет присвоено window.onload. Назначение значения undefined для свойств onevent, очевидно, не имеет никакого эффекта.

0 голосов
/ 13 сентября 2011

Это связано с тем, как работает Javascript. Функции также на самом деле являются объектами, как и все в JavaScript. Таким образом, вы присваиваете «Объект» initAll, который является функцией, window.onload. Этот объект затем вызывается при запуске события onload, предполагая, что это функция.

Теперь, когда вы ставите скобки за именем вашего объекта, вы в основном говорите ему обрабатывать этот объект как функцию и вызывать его. это не способ присвоить его свойству, например, свойство window.onload.

0 голосов
/ 13 сентября 2011

Поскольку вы не вызываете функцию непосредственно в операторе window.onload, а назначаете функцию событию onload.Затем система автоматически вызовет вашу функцию initall, когда произойдет событие.Вот почему вам нужна сама функция (без скобок), а не вызов (с круглыми скобками)

0 голосов
/ 13 сентября 2011

Поскольку вам не следует выполнять функцию в этой строке, вы должны назначить обработчик событий объекту окна, который будет запускаться / выполняться после того, как сработало событие load, а не возвращенное значение функции.

Однако назначать обработчик событий window.onload не рекомендуется, поскольку он позволяет подключать только один обработчик .Попробуйте использовать addEventListener.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...