Вопрос

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 не определен.Как это можно решить?

Это было полезно?

Решение

Обновлять

Ваш обновленный код совершенно отличается от вашего исходного кода. Проблема, кажется, строка, которую вы передаете 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 Для более подробной информации о различинии между экспрессией функции и декларацией функции.

Другие советы

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

Так не пойдет:

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top