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

голоса
0

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

<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 () где-то в теле? Нужно ли мне объявить его до того, как это называется?

Задан 09/12/2008 в 19:45
источник пользователем
На других языках...                            


3 ответов

голоса
5

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

Ответил 09/12/2008 в 19:50
источник пользователем

голоса
0

Вы должны быть в состоянии иметь 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>тега) из - за того , как они загружаются в браузерах.

Ответил 29/09/2009 в 19:58
источник пользователем

голоса
0

Имейте в виду, что многие веб-платформы уже используют метод 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);         
  })
Ответил 03/03/2009 в 22:27
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more