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 ();

问题是,定义了第一个()时,我会得到未定义的错误。如何解决?

有帮助吗?

解决方案

更新

您的更新代码与原始代码完全不同。问题似乎是您传递到的字符串 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();
};

...因为那是非常不同的,所以它使用功能 表达 (作为分步代码的一部分进行处理)而不是功能 声明 (在任何分步代码之前,在进入范围时进行处理),并且有一个呼吁 FirstSecond 被定义为。看 在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"](); 像镀铬中的魅力一样(当然是循环)。也许您的浏览器/js-implementation/dev-tool在函数定义方面更具限制性,并且在定义函数之前,您不使用它们。

那你可能会使用这个 obj["funcname"] = function() {} 语法,与 function funcname(){}, ,但可能不会被您的“破碎” JS-Interpreter检测到错误。

我希望这会有所帮助,尤文

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top