如何从另一个函数访问变量?

时间:2016-06-10 12:30:12

标签: javascript

我使用Google Script创建了两个函数,我需要将变量从第一个函数传递给第二个函数。

代码:

function fetch() {
  var endpoint = 'login';
  var url = 'https://example.com/api/'+endpoint;
  var payload = {
    'username' : "user",
    'password' : "pass",
  }
  var options = {
    'method' : 'post',
    'payload': JSON.stringify(payload),
  };
  var urlResponse = UrlFetchApp.fetch(url, options);
}

按下按钮时调用以下功能:

function logResponse(){
  Logger.log(urlResponse); //This must return the data from the urlResponse variable
}

5 个答案:

答案 0 :(得分:1)

您的两个函数(setVar()logVar())具有不同的范围,这意味着它们无法访问彼此之间的变量/实体。你想要做的是在这两个之外创建一个变量,这样每个函数都可以访问同一个变量:

var a = 0;

function setVar () {
    a = 10;
}

function logVar () {
    Logger.log (a);
}

答案 1 :(得分:1)

我想你可能想要完成以下任务:

function fetch() {
  var endpoint = 'login';
  var url = 'https://example.com/api/'+endpoint;
  var payload = {
    'username' : "user",
    'password' : "pass",
  }
  var options = {
    'method' : 'post',
    'payload': JSON.stringify(payload),
  };
  var urlResponse = UrlFetchApp.fetch(url, options);
  return urlResponse;
}

function logResponse(){
  Logger.log(fetch());
}

所以你可以使用" return"关键字可在其调用时从函数返回值。

然后,您不需要在函数外部声明变量(例如,在全局范围中)。 您只需要调用并将其作为参数传递给您的logResponse()函数。

所以,请注意以下几点:

  • in 1st function - > return urlResponse;
  • 在第二功能中 - > Logger.log(fetch())

P.S。当然,声明两个函数都可以访问的外部作用域中的变量也可以。 但我上面的解决方案似乎是一个更好的选择。

还有一些建议

  • 您可以将您的功能名称从fetch()重命名为fetchUrl以更明确。
  • 第一个函数中urlResponse的变量声明也是多余的,你可以这样做:

return UrlFetchApp.fetch(url, options);

<强>更新

Pavel,看看Jeremy在答案中建议的选项1 。 简而言之,作为建议,您可以将您的代码(取决于您的环境)包装到Immediately-invoked function expression中:

看看下面的例子(注意评论) - &gt;

(function () {
  // all the inside of this function is a shared scope for two function below
  'use strict';

  // this is a declared variable which is accessible for 2nd function
  // the value assigned will be the result of calling the 1st function
  var urlResponse = fetch();

  function fetch() {
    var endpoint = 'login';
    var url = 'https://example.com/api/'+endpoint;
    var payload = {
      'username' : "user",
      'password' : "pass"
    };

    var options = {
      'method' : 'post',
      'payload': JSON.stringify(payload)
    };

    // return the value
    return UrlFetchApp.fetch(url, options);
  }

  function logResponse() {
    // use the shared variable (the value of it is a result of calling fetch() function 
    Logger.log(urlResponse);
  }

  // then if you want to log your response
  // call the function
  logResponse();

})();

答案 2 :(得分:0)

一点解释:

当您将上面声明的变量传递给函数时(如示例中所示),将创建一个闭包。函数将访问此变量。

var a = 11;

function setVar() {
a = '777';
}

function logVar(){
  Logger.log(a);
}

答案 3 :(得分:0)

function fetch() {
  var endpoint = 'login';
  var url = 'https://example.com/api/'+endpoint;
  var payload = {
    'username' : "user",
    'password' : "pass",
  }
  var options = {
    'method' : 'post',
    'payload': JSON.stringify(payload),
  };
  // This variable ONLY exists inside of the fetch function.
  // once this function exits, it is gone.
  var urlResponse = UrlFetchApp.fetch(url, options);
}


function logResponse(){
  // Nope, this is an entirely SEPARATE variable with the same name.
  Logger.log(urlResponse); //This must return the data from the urlResponse variable
}

解决方案:a)将值传递给logResponse()var UrlResponse移动到两个函数可用的外部作用域。不过,保留作业

选项1

var urlResponse;
function fetch() {
  var endpoint = 'login';
  var url = 'https://example.com/api/'+endpoint;
  var payload = {
    'username' : "user",
    'password' : "pass",
  }
  var options = {
    'method' : 'post',
    'payload': JSON.stringify(payload),
  };
  // This variable ONLY exists inside of the fetch function.

  urlResponse = UrlFetchApp.fetch(url, options);
}


function logResponse(){
  // Nope, this is an entirely SEPARATE variable with the same name.
  Logger.log(urlResponse); //This must return the data from the urlResponse variable
}

选项2

function fetch() {
  var endpoint = 'login';
  var url = 'https://example.com/api/'+endpoint;
  var payload = {
    'username' : "user",
    'password' : "pass",
  }
  var options = {
    'method' : 'post',
    'payload': JSON.stringify(payload),
  };
  // This variable ONLY exists inside of the fetch function.

  var urlResponse = UrlFetchApp.fetch(url, options);
  logResponse(urlResponse);
}


function logResponse(urlResponse){
  Logger.log(urlResponse); //This must return the data from the urlResponse variable
}

答案 4 :(得分:0)

请告诉我这是你的情况:

当您运行脚本(打开文档或在doGet上)时调用

函数fetch(),并从界面上的操作调用第二个logResponse()(电子表格按钮或google.script。运行....)。

在这种情况下,脚本会运行&#39;两次,两次运行之间的一切都被遗忘了。你能做的是: A /将您从第一个函数获得的值传递给用户界面并返回第二个函数 B /将您在第一个函数中获得的值存储为:

function fetch() {
  var endpoint = 'login';
  var url = 'https://example.com/api/'+endpoint;
  var payload = {
    'username' : "user",
    'password' : "pass",
  }
  var options = {
    'method' : 'post',
    'payload': JSON.stringify(payload),
  };
  var urlResponse = UrlFetchApp.fetch(url, options);
  PropertiesService.getUserProperties().setProperty("urlResp", urlResponse.getContentText());
}

function logResponse(){
var urlResponse = PropertiesService.getUserProperties().getProperty("urlResp");
  Logger.log(urlResponse); //This must return the data from the urlResponse variable
}

propertiesService只能存储文本(除了userproperty之外,你可以使用其他东西,比如scriptproperty或documentproperty