0
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() 没有定义的错误。如何解决?

4

3 回答 3

4

更新

您更新的代码与原始代码完全不同。问题似乎是您传递给的字符串setTimeout(这让我感到惊讶,但很容易复制)。我会改变

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

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

...或者如果您需要将参数传递给Second

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

;(请注意,在函数声明的末尾不需要 a ,但setTimeout不会出错 [您实际上并不需要它,在这种情况下,“分号插入”的恐怖会为您插入它, 但...]。)

上面的第二个和第三个版本使用函数引用。您的原始文件使用了一个然后编译的字符串,这是不必要的,并且似乎是问题所在(因为这个使用字符串的示例失败了,但是这个带有函数引用的示例有效)。

原始答案

在下面的答案中,您的问题中引用的代码是:

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

该代码将正常工作。这是一个无限循环(好吧,不是无限循环因为最终实现不会有更多的堆栈空间用于返回地址),但直到它因为它爆炸而工作正常。例子

如果您的实际代码看起来更像这样,它将失败:

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

...因为这非常不同,它使用函数表达式(作为分步代码的一部分处理)而不是函数声明(在进入范围时处理,在任何分步代码之前)并且定义了对First之前的调用Second。有关函数表达式和函数声明之间区别的更多详细信息,请参见StackOverflow 上的其他答案。

于 2011-01-10T23:48:26.657 回答
1

好的,我想我看到了你的问题。我敢打赌你的代码包含在一个函数中,对吧?那么就不会有第二个函数这样的东西了。

这将不起作用:

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

但这会起作用:

(function() {
    function First () {
        setTimeout(Second, 50)
    }
    function Second () {
        alert('hi!');
    }
    First();
})();
于 2011-01-11T00:26:16.570 回答
0

我刚刚尝试了您的代码并调用了“Second();” 第一的。它在 Chrome 中运行良好。它当然会永远循环。

在 Javascript 中,变量在调用函数时绑定得很晚。全局对象也只是另一个很晚才“绑定”的变量。一切都可以随时(异步)改变,这就是为什么一个函数不能要求另一个函数可用。“缺失”函数可能只是在调用函数之前由其他机制添加。只有在函数执行之前,JS 运行时才应该检查这个函数是否在作用域中可用。

这就是它在 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解释器可能不会把它检测为错误。

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

于 2011-01-11T00:25:59.817 回答