Javascript 在函数中创建全局变量
因此,我很难将函数中的VAR设置为全局变量,我尝试了以下资源: 我之前的问题被标记为重复,但在查看上面的链接后,它对我的问题没有帮助 这是我之前的问题: 因此,我使用OpenTok创建了一个在线会议工具,需要从不同服务器上的API获取会话详细信息。我在另一台服务器上创建了一个php脚本,它根据URL参数提供的会话id获取会话信息。我知道php脚本和大部分JavaScript工作正常,因为当我从解析的JSON中读取console.log数据时,它会打印正确的信息。但是,当我尝试将变量放入凭据区域时,会出现以下错误:Javascript 在函数中创建全局变量,javascript,variables,scope,Javascript,Variables,Scope,因此,我很难将函数中的VAR设置为全局变量,我尝试了以下资源: 我之前的问题被标记为重复,但在查看上面的链接后,它对我的问题没有帮助 这是我之前的问题: 因此,我使用OpenTok创建了一个在线会议工具,需要从不同服务器上的API获取会话详细信息。我在另一台服务器上创建了一个php脚本,它根据URL参数提供的会话id获取会话信息。我知道php脚本和大部分JavaScript工作正常,因为当我从解析的JSON中读取console.log数据时,它会打印正确的信息。但是,当我尝试将变量放入凭据区域
ReferenceError:会话未定义
以下是用于从单独服务器上的PHP脚本获取JSON的代码:
var url_string = window.location.href;
var url = new URL(url_string);
var session = url.searchParams.get("s");
if (session == '') {
window.location.replace("http://www.google.com");
}
var getJSON = function(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'json';
xhr.onload = function() {
var status = xhr.status;
if (status === 200) {
callback(null, xhr.response);
} else {
callback(status, xhr.response);
}
};
xhr.send();
};
getJSON('http://192.168.64.2/api/meeting/?uid=' + session,
function(err, data) {
if (err !== null) {
console.log('Error');
}
var thesession = data.sessionID;
var thetoken = data.token;
console.log(thesession);
console.log(thetoken);
});
let otCore;
const options = {
credentials: {
apiKey: "####",
sessionId: thesession,
token: thetoken
},
下面是控制台的屏幕截图:
顶部控制台日志为“thesession”,第二个控制台日志为“thetoken”。我试着查找错误,但找不到一个与我的相同用法的
理想的结果是,我可以使用解析后的JSON中的数据,并将结果用作凭证,例如data.sessionID,它绑定到VAR thesession
我知道这可能是一个范围问题,但我不确定如何修改代码以使其按预期工作
任何帮助都将不胜感激,这一点真的让我难堪:)
如何更改作用域以获得所需的函数?我已经查看了上一个问题中给出的链接,但这对我的问题没有帮助。您的问题是这一行
var thesession=data。sessionID
在函数函数(err,data){…}
的范围内。为了允许两个函数使用同一个变量,您需要确保没有在它们无权访问的地方声明该变量
这两者的区别在于:
函数func1(){
变量x=3
}
函数func2(){
console.log(x)
}
func1();
func2()
您的问题是这一行var thesession=data.sessionID
在函数函数(err,data){…}
的范围内。为了允许两个函数使用同一个变量,您需要确保没有在它们无权访问的地方声明该变量
这两者的区别在于:
函数func1(){
变量x=3
}
函数func2(){
console.log(x)
}
func1();
func2()
var thesession=data.sessionID代码>
在其执行上下文中定义,该上下文是传递给getJSON的回调函数
正确方向上的一个步骤是逆转分配。将“thesession”分配给存在“thesession”的范围内的options对象
const options = {
credentials: {
apiKey: "####",
sessionId: null,
token: thetoken
}
};
getJSON('http://192.168.64.2/api/meeting/?uid=' + session,
function(err, data) {
if (err !== null) {
console.log('Error');
}
var thesession = data.sessionID;
var thetoken = data.token;
console.log(thesession);
console.log(thetoken);
options.credentials.sessionId = thesession;
});
但是,重要的是要意识到,您的程序不会等待此任务。它将发送getJSON请求,然后继续处理。在getJSON调用完成并调用其回调之前,您的options对象不会有sessionId
这将是一个深入研究承诺的好机会,它将帮助您更好地理解如何处理javascript的非阻塞性代码>
在其执行上下文中定义,该上下文是传递给getJSON的回调函数
正确方向上的一个步骤是逆转分配。将“thesession”分配给存在“thesession”的范围内的options对象
const options = {
credentials: {
apiKey: "####",
sessionId: null,
token: thetoken
}
};
getJSON('http://192.168.64.2/api/meeting/?uid=' + session,
function(err, data) {
if (err !== null) {
console.log('Error');
}
var thesession = data.sessionID;
var thetoken = data.token;
console.log(thesession);
console.log(thetoken);
options.credentials.sessionId = thesession;
});
但是,重要的是要意识到,您的程序不会等待此任务。它将发送getJSON请求,然后继续处理。在getJSON调用完成并调用其回调之前,您的options对象不会有sessionId
这将是一个深入研究承诺的好机会,这将帮助您更好地理解如何处理javascript的非阻塞特性。使用window.thesession
将变量附加到。虽然不建议使用全局变量,但在99%的情况下,这是不必要的
(或类似),然后在函数中更改它,如x=..
。或者按照@mario_sunny的建议将其添加到窗口
对象中。不管是哪种方式,可能有一种比使用全局变量更好的方法来实现这一点……但在使用window时,我得到了以下错误。“SyntaxError:意外标记:”。“我执行了以下操作:var window.thesession=data.sessionID@DanielFaulkner窗口
已存在。您只需要编写window.thesession=data.sessionID
,然后稍后使用sessionID:window.thesession
引用它。不过,我会推荐我的方法;在我看来,显式修改窗口本身并不是最好的做法。请使用window.thesession
将变量附加到窗口。虽然不建议使用全局变量,但在99%的情况下,这是不必要的(或类似),然后在函数中更改它,如x=..
。或者按照@mario_sunny的建议将其添加到窗口
对象中。不管是哪种方式,可能有一种比使用全局变量更好的方法来实现这一点……但在使用window时,我得到了以下错误。“SyntaxError:意外标记:”。“我执行了以下操作:var window.thesession=data.sessionID@DanielFaulkner窗口
已存在。您只需要编写window.thesession=data.sessionID
,然后稍后使用sessionID:window.thesession
引用它。不过,我会推荐我的方法;在我看来,明确修改窗口本身并不是最好的做法。我喜欢