Начинающий: Javascript должен быть в заголовке для запуска? Имеет ли значение порядок объявления функций? - PullRequest
0 голосов
/ 09 декабря 2008

У меня в голове есть эта функция:

<head>
      window.onload = function(){
         var x = new Array(0,2,3,4,5,6,7,8);
         var y = new Array(20,10,40,30,60,50,70,10);  
         drawGraph(y,x);
      }
</head>

Могу ли я объявить функцию drawGraph () где-нибудь в теле? Нужно ли объявлять это до того, как оно будет вызвано?

Ответы [ 3 ]

5 голосов
/ 09 декабря 2008

Порядок имеет значение. Вам нужно будет объявить функцию drawGraph (), прежде чем она будет вызвана.

0 голосов
/ 29 сентября 2009

Вы должны иметь возможность иметь функцию drawGraph в любом месте документа, потому что она не вызывается до полной загрузки документа. Это означает, что любые теги <script> должны быть уже проанализированы и выполнены.

Хотя порядок имеет значение, также важно то, как вы объявляете функции. Если вы используете синтаксис объявления, ...

function identifier ( arglist ) { body }

... тогда он будет существовать до того, как сценарий даже будет выполнен, независимо от того, где в сценарии вы его объявили (я не уверен, является ли это стандартным для всех интерпретаторов, но, похоже, он применяется в Firefox, Chrome и Internet Explorer). Однако это относится только к одному тегу <script>. Объявления в других тегах сценариев не будут существовать, пока эти сценарии не будут проанализированы, то есть после выполнения предыдущих сценариев.

<html>
    <head>
        <script type="text/javascript">
            function check_existance()
            {
                if(!check_existance.i)
                    check_existance.i = 0;

                document.write("<h5>Call : " + ++check_existance.i + "</h5>" +
                      "func1 : " + typeof func1 + "<br />" +
                      "func2 : " + typeof func2 + "<br />" +
                      "func3 : " + typeof func3 + "<br />" +
                      "func4 : " + typeof func4 + "<br />");
            }
        </script>
        <script type="text/javascript">
            check_existance();

            func1 = function()
                    {
                        alert("func1");
                    };

            check_existance();

            function func2()
            {
                alert("func2");
            }
        </script>
    </head>
    <body>
        <script type="text/javascript">
            check_existance();

            func3 = function()
                    {
                        alert("func3");
                    };

            check_existance();

            function func4()
            {
                alert("func4");
            }
        </script>
    </body>
</html>

Выход:

Звоните: 1
func1: не определено
func2: функция
func3: не определено
func4: не определено

Звоните: 2
func1: функция
func2: функция
func3: не определено
func4: не определено

Звоните: 3
func1: функция
func2: функция
func3: не определено
func4: функция

Звоните: 4
func1: функция
func2: функция
func3: функция
func4: функция

Я полагаю, что YSlow рекомендует размещать теги <script> внизу документа (полагаю, перед закрывающим тегом </body>) из-за способа их загрузки в браузеры.

0 голосов
/ 04 марта 2009

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

Пример без использования инфраструктуры JavaScript, такой как JQuery, будет выглядеть так:

function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
      window.onload = func;
    } 
    else {
      window.onload = function() {
        oldonload();

        var x = new Array(0,2,3,4,5,6,7,8);
        var y = new Array(20,10,40,30,60,50,70,10);  
        drawGraph(y,x);
      }
    }
}

Пример использования JQuery будет выглядеть так:

  $(document).ready(function() {
    var x = new Array(0,2,3,4,5,6,7,8);
    var y = new Array(20,10,40,30,60,50,70,10);  
    drawGraph(y,x);         
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...