【问题标题】:Return value from function parameter in JavascriptJavascript中函数参数的返回值
【发布时间】:2016-08-16 14:02:26
【问题描述】:

我正在尝试使用 fingerprintjs2 javascript 库来获取浏​​览器指纹。

以下代码可以正常工作:

new Fingerprint2().get(function (result) {
    var output = result;
    document.write(output);
});

但是,我想在这个块之外设置一个变量,以便以后使用,例如:

var output;

new Fingerprint2().get(function (result) {
    output = result;
});

document.write(output);

但在这种情况下,我得到了输出:

undefined

我猜这与作用域有关,那么有没有办法在外部作用域中设置变量,或者我需要将以下所有代码都放在这个函数调用中?

我已经阅读了有关获取嵌套函数值的其他问题,但在这种情况下似乎都没有。

【问题讨论】:

  • “与范围有关” - 不,这是因为您在执行output = result; 之前调用了document.write(output);
  • 它未定义,因为document.write(output); 在您的回调之前被调用
  • get 调用异步运行,因此document.write(output)$.get() 调用仍在运行时被调用。
  • 感谢您的信息 - 那么是否可以以允许设置全局变量的方式使用这样的库,或者我是否必须假设使用输出的所有后续代码都需要在这个块,如第一个例子所示?
  • JavaScript 是一种事件驱动的语言,您尝试设计代码的方式超出了范式。您需要重新考虑您的算法以符合事件驱动编程。一种高级的方式来看待它是一个函数调用链。任何使用输出的代码都应该在您的$.get() 调用中调用。代码可以封装在一个单独的函数中,但由于 AJAX 的异步特性,您需要遵循事件驱动范式,

标签: javascript scope nested fingerprintjs2


【解决方案1】:

这不是你应该这样做的方式。 我正在使用 ES6 编写代码。

let Fingerprint2Obj = new Fingerprint2().get(function (result) {
    let obj = {
     output: result
    }
    return obj;
});

你不能在函数外调用var,如果你通过对象或字符串发送它。 document.write(Fingerprint2Obj.output);

【讨论】:

  • 嗯,我不认为Fingerprint2Obj 会采用回调返回的值
  • 这并不能解决 OP 的问题,即希望从全局变量中的异步调用返回的值可以随后被调用。
【解决方案2】:

这不起作用,因为您在异步获取返回之前打印输出。

试试这个:

var output;

var callbackFunction = function(result) {
output = result;
document.write(output);
//do whatever you want to do with output inside this function or call another function inside this function. 
}

new Fingerprint2().get(function (result) {
   // you don't know when this will return because its async so you have to code what to do with the variable after it returns;
   callbackFunction(result);
});

【讨论】:

  • 这类似于我给出的第一个示例 - document.write 工作的地方,但我希望输出变量在外部范围内可用,如果可能的话由其他函数使用。
  • 嗯,你不能。代码是异步的,所以你需要包装它。您可以做的是附加一个回调函数,并在该函数内部执行您想要在异步块之外执行的操作
  • @Arno_Geismar - 所以如果我有另一个函数 DoSomething(result),我如何使用回调来触发它 - 之后运行,并获得指纹结果?
猜你喜欢
  • 1970-01-01
  • 2016-03-25
  • 2016-04-25
  • 1970-01-01
  • 2019-10-27
  • 2012-03-12
  • 1970-01-01
相关资源
最近更新 更多