从全局范围内的函数访问局部变量

时间:2018-10-09 15:59:40

标签: javascript scope

我有一个JSON / API加载回调函数,我用来读取JSON数据的var json = JSON.parse(response);位于其中:

// Call JSON File
function loadJSON(callback) {
    xobj.overrideMimeType("application/json");
    xobj.open('GET', 'pmApp.json', true);
    xobj.onreadystatechange = function () {
    if (xobj.readyState == 4 && xobj.status == "200") {
        // Required use of an anonymous callback as .open will NOT return a value but simply returns undefined in asynchronous mode
        callback(xobj.responseText);
    }
};
xobj.send(null);
};

// Run loadJSON - 
loadJSON(function (response) {
    // Parse JSON string into object
    var json = JSON.parse(response);
});

var json是一个局部变量,我希望保持这种状态(我不想将其设置为全局变量来解决我的问题),但是我有一些函数可以通过HTML onChange事件或需要json var才能正常运行的全局范围内的示例:

//Global Scope
popBrandFields()

function popBrandFields(){
    var brand_items = json.brands[0][client];
};

我无法校准popBrandFields(json),因为var json由于位于本地范围而无法访问。 (出于安全考虑,我想保留这种方式,将其放在全局范围内可以解决我的问题,但我希望将其保留在本地范围内。)

实现此目标的最佳方法是什么?

我当时想从定义的函数中返回var json,但是我不确定如何或是否可以将这种类型的函数设置为变量,如以下示例所示:

function f(){
 var foo = 100;
return foo;
}

var a = f();

也许有更好的方式加载JSON,如果有人知道的话,它可以实现我正在寻找的东西?

2 个答案:

答案 0 :(得分:0)

您可以确保所有需要该值的代码都在SEF(自我执行功能)中。

它将在函数内部创建一个作用域,您可以在其中定义各种事物,但不会污染全局作用域。

var globalVariable = 'bad'

(function(){
  var json = 'not a global variable';

  console.log('Your code goes here!');
})();

答案 1 :(得分:0)

我发现的解决方案是创建一个保存其余代码和var的函数,然后从传递给loadJSON var的json函数进行调用,以便我的新函数可以访问就像这样

loadJSON(function (response) {
    // Parse JSON string into object
    var json = JSON.parse(response);
    jsonUsingFunction(json);
});

这样,我的所有变量都不在全局范围内。

我还没有使用HTML中的onChange,而是使用事件侦听器来解决我的问题!