Javascript 在函数中创建全局变量

Javascript 在函数中创建全局变量,javascript,variables,scope,Javascript,Variables,Scope,因此,我很难将函数中的VAR设置为全局变量,我尝试了以下资源: 我之前的问题被标记为重复,但在查看上面的链接后,它对我的问题没有帮助 这是我之前的问题: 因此,我使用OpenTok创建了一个在线会议工具,需要从不同服务器上的API获取会话详细信息。我在另一台服务器上创建了一个php脚本,它根据URL参数提供的会话id获取会话信息。我知道php脚本和大部分JavaScript工作正常,因为当我从解析的JSON中读取console.log数据时,它会打印正确的信息。但是,当我尝试将变量放入凭据区域

因此,我很难将函数中的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
引用它。不过,我会推荐我的方法;在我看来,明确修改窗口本身并不是最好的做法。我喜欢