【问题标题】:firefox localStorage undefined火狐本地存储未定义
【发布时间】:2014-05-27 22:15:53
【问题描述】:

在 Firefox 中,当我尝试时出现奇怪的行为(甚至在 firebug cosnole 中的任何地方)

function supports_local_storage() {
    try {
        return 'localStorage' in window && window['localStorage'] !== null;
    } catch(e){
        return false;
    }
}

var localStorageEnabled = supports_local_storage();
if (!localStorageEnabled) { 
    alert('am in');
    console.log('am in');
    var localStorage = localStorage;
};
localStorage.setItem("textsfff", "20");

.. 如果在firefox中启用了localStorage,则不会弹出警报/控制台日志,但localstorage被未知进程破坏,因此setItem失败。

如果我重写

var localStorage = localStorage;

localStorage = localStorage;

代码奇迹般地工作,当“var localstorage”出现在代码中的任何地方时,它就像localstorage一样被删除,即使条件不满足。

我在 Firefox 29.0.1 中遇到了这个问题

我不能用

localStorage = 本地存储;

因为在控制台模式下我必须自己定义本地存储并且需要“var 声明”。

【问题讨论】:

  • localStorage = localStorage; 没有做任何事情,就像 var x; x = x; 没有做很多事情一样。
  • '因为在控制台模式下我必须自己定义本地存储并且需要'var 声明''是什么意思?
  • mb21 - 在控制台模式下 localstorage 不存在,所以我自己制作了一个并将其设置为 localStorage 变量。但是由于 MrCode 的解释,即使条件不为真,条件中的 var 重新定义也会运行。

标签: javascript firefox local-storage


【解决方案1】:

当“var localstorage”出现在代码中的任何地方时,它的类似 localstorage 会被删除,即使条件不满足。

localStorage 对象在全局范围内,是window 对象的一个​​属性。如果您使用 var localStorage,那么您将无法再从该范围访问全局 localStorage 对象 - 除非您像这样使用 window 前缀:

window.localStorage.getItem(..);

情况确实如此,即使您的条件不满足,因为所有var 声明都被提升到当前范围的顶部,而不管任何条件语句。代码相当于:

var localStorage;

if(!localStorageEnabled){
    localStorage = localStorage; // this is undefined
}

所以当您执行var localStorage = localStorage 时,局部变量localStorage 已声明但未定义,在当前范围的顶部,那么您将undefined 分配给本地localStorage。这就是为什么localStorage = localStorage 在没有var 的情况下工作的原因,因为没有var 它正在寻找全局对象。

我不能使用localStorage = localStorage;,因为在控制台模式下我必须自己定义本地存储并且需要“var 声明”。

在这种情况下,您可以在 localStorage 存在/启用时使用 window 前缀。

var localStorage = window.localStorage;

【讨论】:

  • Tnx 回答,这很清楚发生了什么。但是我仍然卡住了,因为在 firefox 中的var localStorage = localStorage; 之后,window.localStorage 也未定义,所以我无法将其设置回来或使用它。我尝试了 eval("var localStorage = 10"); ,它适用于 firefox,但在控制台模式下崩溃,我继续将自定义类设置为 localStore 变量。
  • 我认为您需要一个 else 块,以便您可以执行 else { localStorage = window.localStorage; }。在 if 块中,您似乎应该将其设置为您的自定义对象。
  • 我接受了你的回答,因为它清楚地表明用“var”定义重新定义 localStorage 只是个坏主意,并导致 ff 完全崩溃。通过控制台,我的意思是 js 通过节点 $result = exec("node -e {$jsContent}) 运行,我的最终解决方案只是从共享 js 中取出整个部分,并仅在运行测试时将其单独添加到 $jsContent 中。
猜你喜欢
  • 2011-04-19
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 2022-01-05
相关资源
最近更新 更多