访问范围之外的变量(javascript)

时间:2017-09-12 03:03:08

标签: javascript function

我试图访问函数范围之外的变量。我试图访问功能之外的价格。我是否必须等到请求完成,或者我无法获得价格?

        var httpRequest = new XMLHttpRequest();
        httpRequest.open('GET', "https://api.iextrading.com/1.0/stock/aapl/quote", true);
        httpRequest.send();
        httpRequest.addEventListener("readystatechange", processRequest, false);

        function processRequest(e) {
            if (httpRequest.readyState == 4 && httpRequest.status == 200) {
                response = JSON.parse(httpRequest.responseText);
                console.log(response.latestPrice);
                var lastPrice = response.latestPrice;
                document.getElementById("StockPrice").innerHTML = lastPrice;
                price = lastPrice;
            }
        }
        document.write("outside: " + price);

3 个答案:

答案 0 :(得分:3)

您无法访问该函数范围之外的price变量。您可以做的是返回价格,然后将该函数的调用分配给变量。例如:

var price = processRequest();

但是,该调用将是异步的,因此您必须从该函数内部进行document.write调用,或者您必须设置某种承诺或回调以确保{{1仅在请求完成后调用(并且实际为document.write分配了值)。

这看起来像是:

price

答案 1 :(得分:1)

var httpRequest...一起尝试设置var price = null

就你的JS文件所知,"价格"因为变量不存在于processRequest()范围之外。

使用"使用严格"在文档的顶部将使这样的范围问题更容易看到=)

答案 2 :(得分:0)

首先,如果你想在JS之外的任何变量访问它,那么使用closures。我没有看到价格在哪里宣布,如果它是全球性的,那么你的情况就好了。

有两种类型的请求同步&异步(more here),并且应始终优先选择异步请求以获得出色的性能。在您的情况下,价格取决于请求的响应,您应该等到响应来。你可以通过两种方式来做到这一点

  1. 在UI上添加处理图标,直到您收到响应(针对异步请求)
  2. 使用同步请求