开发者问题收集

如何在 javascript 中赋予局部变量全局作用域

2017-08-03
121

以下代码片段是 Drift chat 方法,用于获取用户在聊天中提供的 email id

我试图通过将 email id (e.data.email) 存储在全局变量 data_email 中来访问给定函数范围之外的它。

我尝试了 three 方法来创建 data_email 全局变量 - windowletconst

window.drift.on("emailCapture", function(e) {
    console.log("user identified as: " + e.data.email);

    window.data_email = e.data.email;
    // let data_email = e.data.email;
    // const data_email = e.data.email;

    ga('send', 'event', {
        eventCategory: 'driftemail',
        eventAction: 'driftemailCaptured',
    });
});

console.log(data_email);

尝试了所有方法后,我得到了错误 - Uncaught ReferenceError: data_email is not defined 。 请任何人给我一个解决方法,我将不胜感激。我的目标是在给定函数之外访问捕获的电子邮件。

3个回答

您遇到的问题是您正在监听一个事件。这可能现在发生,稍后发生或永远不会发生。但是您立即尝试控制台记录它。

鉴于您提供的信息量很少,您的问题可能有多种解决方案。但有一种解决方案是:

  • 在函数外部,该函数接受电子邮件并将其设置为全局变量

  • 使用电子邮件作为参数调用该函数

类似这样的

window.drift.on("emailCapture", function(e) {
    console.log("user identified as: " + e.data.email);

    setChatEmail(e.data.email);

    //window.data_email = e.data.email;
    //let data_email = e.data.email;
    //const data_email = e.data.email;

    ga('send', 'event', {
        eventCategory: 'driftemail',
        eventAction: 'driftemailCaptured',
    });
});


function setChatEmail(email) {
  window.data_email = email;
}

进一步阅读:

如何 设置 全局变量。

为什么 全局 变量不好。

Amiga500
2017-08-03

您的 console.log 在“emailCapture”事件执行之前运行。这就是它给出未定义的原因,请在执行此事件后尝试您想要做的一切。

 var data_email;
 var getEmail = function() {
     console.log(data_email);
 };
 window.drift.on("emailCapture", function(e) {
    console.log("user identified as: " + e.data.email);

    window.data_email = e.data.email;
    data_email = e.data.email;
    // const data_email = e.data.email;

    ga('send', 'event', {
        eventCategory: 'driftemail',
        eventAction: 'driftemailCaptured',
    });
    getEmail();
});
Selvakumar
2017-08-03

您需要先初始化顶部的 window.data_email ,然后对其进行变异。因为 console.log 将在初始化之前运行。

Le Duy Khanh
2017-08-03