простая задача определения функции javascript - PullRequest
0 голосов
/ 11 января 2011
function First () {
setTimeout("Second()", 50)
};

function Second () {  //I'm very confident this conditional works fine
 if  (document.getElementsByClassName("l")[0].href ==
      document.getElementById("myFrame").getAttribute("src"))  
   {  
   First();                                       
   }
 else
   {
   var newLink = document.getElementsByClassName("l")[0].href;        //
   document.getElementById("myFrame").setAttribute("src", newLink);
   }};

First ();

Проблема в том, что когда First () определен, я получаю ошибку, что Second не определен Как это можно решить?

Ответы [ 3 ]

4 голосов
/ 11 января 2011

Обновление

Ваш обновленный код сильно отличается от вашего исходного кода.Кажется, проблема в том, что вы передаёте строку setTimeout (что удивило меня, но было легко воспроизведено).Я бы изменил

function First () {
    setTimeout("Second()", 50)
};

на

function First () {
    setTimeout(Second, 50);
}

... или если вам нужно передать параметры в Second:

function First() {
    setTimeout(function() {
        Second(param0, param1);
    }, 50);
}

(обратите внимание, что естьнет необходимости в ; в конце объявления функции, но один после setTimeout не сработает [вам на самом деле не нужно , ужас - «вставка точки с запятой»вставит его для вас в этом случае, но ...].)

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

Оригинальный ответ

В ответе ниже код, указанный в вашем вопросе, был:

function First() {Second();};
function Second() {First();};

Этот код будет работать очень хорошо.Это бесконечный цикл (ну, не бесконечный , потому что в итоге у реализации не будет больше места в стеке для адресов возврата), но пока он не взорвется из-за этого, он будет работать нормально. Пример

Не удастся, если ваш фактический код будет выглядеть примерно так:

var First = function() {
    Second();
};
First();
var Second = function() {
    First();
};

... потому что он сильно отличается, он используетфункция выражения (которые обрабатываются как часть пошагового кода), а не функция декларации (которые обрабатываются при входе в область действия, перед любым пошаговымкод) и имеет вызов First до определения Second.См. этот другой ответ здесь в StackOverflow для более подробной информации о различии между выражением функции и объявлением функции.

1 голос
/ 11 января 2011

Хорошо, я думаю, что вижу вашу проблему.Могу поспорить, твой код обернут внутри функции, верно?Тогда не было бы такого понятия, как функция Second.

Это не будет работать:

(function() {
    function First () {
        setTimeout("Second()", 50)
    }
    function Second () {
        alert('hi!');
    }
    First();
})();

Но это будет работать:

(function() {
    function First () {
        setTimeout(Second, 50)
    }
    function Second () {
        alert('hi!');
    }
    First();
})();
0 голосов
/ 11 января 2011

Я только что попробовал ваш код и вызвал "Second ();"первый.Он работал нормально в Chrome.Конечно, это будет цикл навсегда.

В JavaScript переменные связаны очень поздно при вызове функции.Глобальный объект - это просто еще одна переменная, которая также «связана» очень поздно.Все может измениться в любое время (асинхронно), поэтому функция не должна требовать наличия другой функции.«Отсутствующая» функция может быть просто добавлена ​​каким-либо другим механизмом непосредственно перед ее вызовом.Только непосредственно перед выполнением функции JS-среда должна проверить, доступны ли эти функции в области.

Именно поэтому она работает в Chrome.В Javascript вы на самом деле делаете что-то вроде этого:

var GLOB = this; // bind global obj to variable

GLOB["First"] = function() {
   GLOB["Second"]();
};

GLOB["Second"] = function() {
   GLOB["First"]();
};

Invoking GLOB["Second"](); работает как брелок в Chrome (и, конечно, циклично).может быть, ваш браузер / JS-реализация / dev-tool более ограничен в отношении определений функций, и давайте не будем использовать функции до их определения.

Тогда вы можете использовать этот синтаксис obj["funcname"] = function() {}, который делает то жеfunction funcname(){}, но ваш "сломанный" JS-интерпретатор может не обнаружить ее как ошибку.

Надеюсь, это поможет, Юве

...