Javascript 从全局作用域上的函数访问局部变量
我有一个JSON/API加载回调函数,其中myJavascript 从全局作用域上的函数访问局部变量,javascript,scope,Javascript,Scope,我有一个JSON/API加载回调函数,其中myvar JSON=JSON.parse(response)位于我用来读取JSON数据的位置: // Call JSON File function loadJSON(callback) { xobj.overrideMimeType("application/json"); xobj.open('GET', 'pmApp.json', true); xobj.onreadystatechange = function () {
var JSON=JSON.parse(response)
位于我用来读取JSON数据的位置:
// 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
是一个局部变量,我希望保持这种方式(我不想让它成为全局变量,这会解决我的问题),但我有一些函数是通过HTMLonChange
事件调用的,或者是在全局范围内调用的,它们需要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,也许有更好的加载JSON的方法可以实现我想要的功能?您可以确保所有需要此值的代码都在SEF(自动执行功能)中 它在函数中创建了一个作用域,您可以在其中定义各种内容,但不会污染全局作用域
var globalVariable = 'bad'
(function(){
var json = 'not a global variable';
console.log('Your code goes here!');
})();
我找到的解决方案是创建一个包含其余代码和变量的函数,然后我会从
loadJSON
函数调用它,并传入json
var,这样我的新函数就可以像这样访问它
loadJSON(function (response) {
// Parse JSON string into object
var json = JSON.parse(response);
jsonUsingFunction(json);
});
这样,我的VAR都不在全局范围内
var globalVariable = 'bad'
(function(){
var json = 'not a global variable';
console.log('Your code goes here!');
})();
另外,我没有使用HTML中的
onChange
,而是使用事件侦听器,解决了我的问题 在全局范围内定义json变量,然后在AJAX调用中分配它的值。该值将在全局范围内捕获,并可供其他函数使用。您希望json变量为本地变量而非全局变量的具体原因是什么?异步加载数据这一事实意味着它不是一个简单的引用。是否可以调用popBrandFields()
在loadJSON
内部?您仍然可以将其设置为全局的,并在加载json后调用类似popBranchFields的函数,对于事件处理程序函数,可以在事件处理程序函数中初始化json或不初始化json。