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,那么也需要处理它。