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

问题描述:

我有两个用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 
} 
+0

范围:在'function setVar()'之前声明'a'如果你不这样做,每个'a'封装在每个功能,就像有两个不同的'a' –

一点点的解释:

当你通过变量,上面的声明函数(例如)将创建一个闭包。并且函数将访问这个变量。

var a = 11;

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

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

我相信对你的建议有一些解释会有帮助(见上面我的评论) –

+0

我会更新t他问我的代码 – Valip

你的两个函数(setVar()logVar())有不同的范围,这意味着他们不能访问变量彼此内/实体。你要做的是创建一个变量这两个之外,让每个函数可以访问相同的变量,例如:

var a = 0; 

function setVar() { 
    a = 10; 
} 

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

我已更新与我的代码 – Valip

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 
} 

解决方案:要么一)在价值传递给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 
} 
+0

问题请检查我更新的问题,我加我的代码 – Valip

+0

OH ..这成为和完全不同的问题。 –

+0

是的,我认为第一个例子和我的代码一样.. – Valip

我想你可能要实现以下目标:

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()); 
} 

所以,你可以使用“返回”关键字在其调用中返回函数的值。

然后,您不需要在函数之外声明变量(例如在全局范围中)。 您只需拨打,并将其作为参数传递给您的logResponse()函数。在第2个功能>return urlResponse;

  • - - 在第一个功能

    • >Logger.log(fetch())

    附注:

    所以,要注意这些行当然在外部范围声明一个变量可以同时访问这两个函数。 但我上面的解决方案似乎是一个更好的选择。

    还有些建议

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

    return UrlFetchApp.fetch(url, options);

    更新:

    帕维尔,看看选项1这杰里米在答案中提出了建议。 总而言之一句话,作为一个建议,你可以用你的代码块(取决于您的环境)为Immediately-invoked function expression

    看看下面的例子(注意评论) - >

    (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(); 
    
    })(); 
    
  • +0

    我在想这个,但这意味着我必须执行两次第一个函数: 首先,当我检查登录凭证时,第二次当我登录'urlResponse'时。我希望有另一种方法来解决这个问题... – Valip

    +0

    不知道,我很好。 所以,如果有另一个地方,你可以调用你的fetch()函数。 而且你不想调用它两次。那么可能共享范围是一个解决方案。直到你没有称为依赖注入的东西。 –

    +0

    @PavelValeriu和最好的选择将使用返回关键字,但将值分配给共享作用域中的变量(可用于第二个功能) –

    请告诉我,如果这是您的方案:

    功能fetch()当你运行脚本(打开文档或在的doGet)被调用,第二个logResponse()从在接口(电子表格按钮或谷歌的行动调用。 script.run ....)。

    在这种情况下脚本是'运行'两次,一切都被遗忘在两次运行之间。你可以做的是: 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

    +0

    我使用'fetch'函数进行登录过程,所以当我按下登录按钮时会调用它,然后第二个函数也会在按下按钮时被调用 – Valip