Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使函数中定义的变量newUser成为全局变量?_Javascript_Scope_Google Chrome Extension - Fatal编程技术网

Javascript 如何使函数中定义的变量newUser成为全局变量?

Javascript 如何使函数中定义的变量newUser成为全局变量?,javascript,scope,google-chrome-extension,Javascript,Scope,Google Chrome Extension,我使用chrome.extension.getBackgroundPage()将变量newUser从options.html发送到background.html,如下所示 document.getElementById("save").addEventListener( "click", function () { var newUser = document.getElementById("getEmail").value; var bkg =

我使用
chrome.extension.getBackgroundPage()
将变量
newUser
options.html
发送到
background.html
,如下所示

document.getElementById("save").addEventListener(
    "click", function ()
    {
        var newUser = document.getElementById("getEmail").value;
        var bkg = chrome.extension.getBackgroundPage();
        bkg.saveNewUser(newUser);
        console.log("newUser " + newUser);
    } , false)
background.html
中,我有

function saveNewUser (newUser)
{
    newUser = newUser; //this should be global?
    console.log("newUser from options page " + newUser);
}

console.log("newUser from options page " + newUser);
但是
newUser
是该函数的本地函数。我的理解是,如果一个变量保存在一个没有关键字
var
的函数中,它应该是全局变量。但在这种情况下,情况并非如此。函数外部的
console.log
抛出
uncaughtreferenceerror:newUser未定义
错误

我做错了什么?如何在函数外部修复使用
newUser
的范围

谢谢

编辑

我在
background.html
中尝试了以下操作,但仍然出现newUser undefined错误:

var extension_user

function saveNewUser (newUser)
{
    extension_user = newUser; //this should be global
    console.log("extension_user from options page " + extension_user);
}

console.log("extension_user from options page " + extension_user);
更新

我更改了两个页面以反映答案和注释,但仍在函数外部,变量未定义。我做错了什么

options.html

document.getElementById("save").addEventListener(
    "click", function ()
    {
        var newUserEmail = document.getElementById("getEmail").value;
        var bkg = chrome.extension.getBackgroundPage();
        bkg.saveNewUser(newUserEmail);
        console.log("newUserEmail " + newUserEmail);
    } , false)
var newUser

function saveNewUser (newUserEmail)
{
    window.newUser = newUserEmail; //this should be global
    console.log("newUser from options page inside function" + newUser);
}

console.log("newUser from options page " + newUser);
background.html

document.getElementById("save").addEventListener(
    "click", function ()
    {
        var newUserEmail = document.getElementById("getEmail").value;
        var bkg = chrome.extension.getBackgroundPage();
        bkg.saveNewUser(newUserEmail);
        console.log("newUserEmail " + newUserEmail);
    } , false)
var newUser

function saveNewUser (newUserEmail)
{
    window.newUser = newUserEmail; //this should be global
    console.log("newUser from options page inside function" + newUser);
}

console.log("newUser from options page " + newUser);

在调用函数
saveNewUser
之前,全局作用域中不存在
newUser
变量。因此,它给出了一个参考误差。只需将全局范围内的变量
newUser
声明为
var newUser。这应该可以解决问题。声明变量时始终使用
var
关键字。这是一个很好的编程实践。永远不要在局部范围内声明全局变量。你已经知道为什么了。如果这个答案对你有帮助,请投我一票

编辑:

下面是澄清我答案的代码:

var newUser; // new user declared as a global

function saveNewUser (newuser)
{
    newUser = newuser; // this should be global?
    console.log("newUser from options page " + newUser);
}

console.log("newUser from options page " + newUser); // no more reference error

如果要将其另存为全局变量,可以在函数中更改变量的名称:

function saveNewUser (newUserVar)
{
    newUser = newUserVar; //this should be global?
    console.log("newUser from options page " + newUserVar);
}

console.log("newUser from options page " + newUser);
或者您可以使用窗口范围(与全局范围相同):


所有全局变量本质上都是窗口对象的属性。

这里的问题是阴影。局部变量
newUser
对全局变量进行阴影处理。为您的本地计算机指定不同的名称以避免冲突。(从技术上讲,有一种方法可以取消全局变量的阴影,但最好先重命名以避免出现问题。)没有阴影,因为没有局部变量。当您在JavaScript中没有使用var关键字声明变量时,解释器将其视为全局变量!在这种情况下,入站参数
newUser
是局部变量。@RaymondChen无论哪种情况,函数范围之外的
console.log
都会给出一个引用错误,因为全局变量
newUser
在执行时不存在(假设他只更改参数的名称)。他仍然需要在全局范围内显式声明变量。这是可能的,但您需要推迟全局代码的执行,直到saveNewUser函数保存全局变量。这有点复杂。最好将全局代码放在saveNewUser函数中。其他函数仍将能够访问全局newUser。您可能还希望重构代码,以避免使用全局函数,以支持返回和参数。@ClementHerreman谢谢您提供一个示例,在调用saveNewUser函数之前,您的global scope console.log可能被命中。另外,确保声明
newUser
var的范围是全局范围。如果不是,则
newUser
window.newUser
之间会有差异。这仍然会给出一个引用错误,因为调用全局
console.log
时变量不存在。它只有在调用
saveNewUser
函数时才存在。对。我的印象是,在调用saveNewUser函数一段时间后,global console.log被调用了。但是,是的,如果有可能在函数之前调用global console.log,那么也需要处理它。