JavaScript调用堆栈

时间:2013-05-12 22:36:11

标签: javascript ajax recursion callstack

我是网络开发的新手,并且一直在阅读AJAX,以便我可以使用新数据实时更新地图。我正在阅读关于Comet的IBM文章。它们为Apache Tomcat提供了一个实现。

文章:http://www.ibm.com/developerworks/web/library/wa-cometjava/#resources

他们提供的JavaScript代码如下..

<SCRIPT TYPE="text/javascript">
            function go(){
                var url = "http://localhost:8484/WeatherServer/Weather"
                var request =  new XMLHttpRequest();
                request.open("GET", url, true);
                request.setRequestHeader("Content-Type","application/x-javascript;");
                request.onreadystatechange = function() {
                    if (request.readyState == 4) {
                        if (request.status == 200){
                            if (request.responseText) {
                                document.getElementById("forecasts").innerHTML = 
request.responseText;
                            }
                        }
                        go();
                    }
                };
                request.send(null);
            }
        </SCRIPT>
    </head>
    <body>
        <h1>Rapid Fire Weather</h1>
        <input type="button" onclick="go()" value="Go!"></input>
        <div id="forecasts"></div>
    </body>

我理解这一切但有一些问题。

1)request.send()会产生一个新线程吗? 2)对go()的递归调用最终会导致堆栈溢出吗?

3 个答案:

答案 0 :(得分:0)

go()只会在请求成功时执行,因此您一次只能有一个请求,我认为它不会导致堆栈溢出,但递归函数可能会导致它像任何其他语言一样。在JavaScript中,Ajax请求可以在异步模式或非异步模式下执行,open()方法的最后一个参数将确定要使用的模式,您可以在此处找到更多详细信息http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp希望它有帮助:)

答案 1 :(得分:0)

request.send()是异步的 - 无论是在内部生成新线程还是重用某个现有线程都是实现细节,但当request.open的最后一个参数为true时,它应该是异步的

由于request.send()是异步的,onreadystatechange调用(稍后会发生)不会与原始go共享堆栈。所以我希望堆栈溢出是不可能的。

答案 2 :(得分:0)

执行request.send()时将创建一个新线程,除非您在open方法中明确指定。

go的调用永远不会导致stackoverflow异常。这是因为它在回调中被调用,并且在数据返回时将重置调用堆栈。它可能看起来像一个递归函数,但事实并非如此。虽然它是在go-function中定义的,但执行上下文将完全不同。