gpt4 book ai didi

javascript - 为什么这个变量在一个非全局函数中没有 var 保存?

转载 作者:行者123 更新时间:2023-11-30 08:12:54 25 4
gpt4 key购买 nike

这个问题与 I asked yesterday 类似的 javascript 作用域问题有关。 .我希望你能帮我解决这个问题。

我正在使用 Chrome 扩展程序。 options.html保存到 localStorage新用户电子邮件为“用户”并调用refreshUser()background.html 中发挥作用:

//save entered gmail address
document.getElementById("save").addEventListener(
"click", function ()
{
var user = document.getElementById("getEmail").value;
localStorage.setItem("user", user);
chrome.extension.getBackgroundPage().refreshUser();
} , false)

然后我将电子邮件保存为 background.html 中的“newUser” .问题是 newUserrefreshUser()内更新但它是 null外面refreshUser() :

newUser = localStorage.getItem("user");
console.log("first newUser " + newUser);
//newUser=null

function refreshUser ()
{
newUser = localStorage.getItem("user");
console.log("newUser inside of refreshUser function " + newUser);
//newUser is updated with saved email in localStorage
}

console.log("newUser after refreshUser() " + newUser);
//newUser=null

为什么是newUser本地到 refreshUser()虽然它是在没有 var 的情况下定义的关键词?感谢您的帮助!

更新

回应pimvdb's answer我复制了我的 background.html 的代码.如果我想使用 newUserformData如图所示,我需要在 refreshUser() 中调用哪个函数?谢谢。

<html>
<script>

newUser = localStorage.getItem("user");
console.log("first newUser " + newUser);

function refreshUser ()
{
newUser = localStorage.getItem("user");
console.log("newUser inside of refreshUser function " + newUser);
}

console.log("newUser after refreshUser() " + newUser);

//I want to user newUser below in formData
chrome.browserAction.onClicked.addListener(function(tab)
{
chrome.tabs.getSelected(null,
function(tab)
{
// Send a request to the content script.
chrome.tabs.sendRequest(tab.id, {action: "getDOM"},
function(response)
{
var firstParagraph = response.dom;

var formData = new FormData();
formData.append("url", tab.url);
formData.append("title", tab.title);
formData.append("pitch", firstParagraph);
formData.append("extension_user", "abc@gmail.com");
//I want to user newUser here:
//formData.append("extension_user", newUser);
console.log("newUser inside formData: " + newUser)

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://ting-1.appspot.com/submithandlertest", true);
xhr.onreadystatechange =
function (aEvt)
{
if (xhr.readyState == 4)
{
if (xhr.status == 200)
{
console.log("request 200-OK");
chrome.browserAction.setBadgeText ( { text: "done" } );
setTimeout(function ()
{
chrome.browserAction.setBadgeText( { text: "" } );
}, 2000);
}
else
{
console.log("connection error");
chrome.browserAction.setBadgeText ( { text: "ERR" } );
}
}
};
xhr.send(formData);
}); //chrome.tabs.sendRequest
});
});


</script>
</html>

更新回答pimvdb's comment :

我遇到的问题是 background.html打开浏览器时加载,但电子邮件保存在 options.html 中然后。所以refreshUser()告诉background.html得到newUser来自本地存储。然后我需要像这样在 formData 中使用“newUser”:

formData.append("extension_user", newUser);

但是我现在在refreshUser() 之外拥有它的“newUser”方式一片空白。我错过了什么?

更新以阐明为什么某些日志未显示在控制台中

这是我的做法:

1. I reload the extension and start with localStorage empty
2. I use the extension to save a bookmark
3. all 3 logs are null as expected

first newUser null
newUser after refreshUser() null
newUser inside formData: null
request 200-ok

4. now I save user email in options as abc@gmail.com
5. now I use the extension again to save a bookmark
6. now refreshUser is executed and the log inside the function says abc@gmail.com and formData log says abc@gmail.com

newUser inside of refreshUser function abc@gmail.com
newUser inside formData: abc@gmail.com
request 200-OK

7. but what confuses me is that now the first 2 logs do not show in the console. Why?

最佳答案

它是全局性的,但您在错误的时间访问它。

function refreshUser () { ... } 只是一个函数声明;什么都没有真正执行。该声明之外的两个日志立即运行,此时 localStorage 项尚未设置(即 null)。

您的措辞“refreshUser() 之后的新用户”相当含糊。声明后确实执行了,但是newUser根本没有变,所以两者都在函数lognull之外记录。您无法在尚未设置时访问它,但您似乎在期待它。

由于全局变量已更新,因此以下内容应该可以正常记录。只需在 refreshUser 中设置它之后 就可以调用它。

function otherFunction() {
// logs the global variable 'newUser', which is thus indeed global
console.log("newUser inside otherFunction: " + newUser);
}

function refreshUser ()
{
newUser = localStorage.getItem("user");
otherFunction();
}

关于javascript - 为什么这个变量在一个非全局函数中没有 var 保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7918179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com