【问题标题】:Javascript (variable scopes): variable does not get the value assigned to itJavascript(变量范围):变量没有获得分配给它的值
【发布时间】:2023-04-06 05:30:01
【问题描述】:

我对 JS 很陌生,我正在尝试在函数中设置变量的值,但在设置值后它是“未定义的”。我的代码如下:

    (function (name, context, definition){ 'use strict' ...} ('FP2', this, function (){...})
var fp = new FP2();   
fp.get(function(result, components) { for (var index in components){...};
    var IP = 'nothing';                                                               
    $.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) {
      this.IP = JSON.stringify(data, null, 2);
      alert(this.IP);
    });

    alert(IP);
});

我希望 IP 变量在函数内部和外部具有相同的值,但事实并非如此。内部警报显示预期值,但函数外部的警报显示“无”。 从类似的问题123,我没有使用 var 重新声明函数内部的局部变量,而是使用 'this.' 指向函数外部的 IP 变量,所以我不明白为什么它不能按预期工作?

【问题讨论】:

    标签: javascript scope global-variables


    【解决方案1】:

    不需要使用this.IP,当您在API调用中使用this时,您指的是该API调用函数本身。只需使用IP 就可以了。

    API 调用之外的alert(IP); 也不会返回结果。这个函数调用会在 API 返回一些数据之前立即被调用,因此它会打印出之前的值undefined

    (function (name, context, definition){ 'use strict' ...} ('FP2', this, function (){...})
    var fp = new FP2();   
    fp.get(function(result, components) { for (var index in components){...};
        var IP = undefined;                                                               
        $.getJSON('http://gd.geobytes.com/GetCityDetails?callback=?', function(data) {
         IP = JSON.stringify(data, null, 2);
         alert(IP);
        });
    
        alert(IP); //This will return undefined
    });
    

    【讨论】:

    • 我的目标是在函数之外拥有 IP 值,所以我希望第二个警报显示我在函数中设置的内容。
    • 你能解释更多吗,我不明白。怎么解决?
    • 使用前需要等待API返回任何结果。因此解决方案是在该函数中获取结果后移动您需要运行的所有代码,或者显式使用 Promise。
    【解决方案2】:

    如果您想在任何地方获取IP值,请使用以下方法:

    var IP = undefined;
    var fpData = {};
    function setIP(){
      var valueIP = undefined;
      $.ajax({
            url: "http://gd.geobytes.com/GetCityDetails?callback=?",
            async: false,
            dataType: 'json',
            success: function(data) {
                valueIP = JSON.stringify(data, null, 2); //console.log(valueIP);
                //return valueIP;
                localStorage.setItem('IP', valueIP);
            }
        });
      //return valueIP;
    }
    
    //call setIP
    setIP();
    IP = localStorage.getItem('IP');
    console.log(IP);
    

    【讨论】:

      猜你喜欢
      • 2015-12-06
      • 1970-01-01
      • 2011-11-19
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2015-07-28
      • 2014-03-04
      相关资源
      最近更新 更多