2017-08-14 123 views
1

我正在与localstorage第一次合作,并遇到了一些范围问题。Javascript本地存储范围

当我尝试console.log(test)时,我在我的第二个if声明中得到undefined。我究竟做错了什么?

我的代码如下;

$("document").ready(function(){ 

    var is_stopped = false; 

    source.onmessage = function(event) { 

     if (is_stopped) { 
      localStorage.setItem('offline', event.data); 
      var test = localStorage.getItem('offline'); 
      console.log(test); // works here 
     }  

     if (!is_stopped) { 
      document.getElementById("result").innerHTML += "Data:" + event.data + "<br>"; 
      console.log(test); // undefined 
     } 

     $("#start").click(function(){ 
      is_stopped = false; 
     }); 

     $("#stop").click(function(){ 
      is_stopped = true; 
     }); 

}); 

<div id="result"></div> 
<button id="stop"> stop</button> 
<button id="start"> start</button> 
+2

当然这是undefined值进行分配。因为你没有定义它。你不能同时进入'if(is_stopped)'和'if(!is_stopped)'。 – dfsq

+0

因为它只在'if(is_stopped)'块中定义,并且在其他任何地方没有值,尤其是在'if(!is_stopped)'块中。 –

+0

你的点击处理程序在哪里?您点击时正在设置is_stopped,但您并未要求进一步的操作。您需要一个处理程序来告诉浏览器您在设置状态后实际上想要执行的操作。 – Korgrue

回答

1

它可能是因为is_stopped是假的,因此,如果和犯规检索值它不进入第一个。请注意,函数内部声明的变量在函数结束时会被垃圾回收。

var test;//stays persistent 
source.onmessage = function(event) { 

    if (is_stopped) { 
     localStorage.setItem('offline', event.data); 
     test = localStorage.getItem('offline'); 
     console.log(test); // works here 
    }  

    if (!is_stopped) { 
     document.getElementById("result").innerHTML += "Data:" + event.data + "<br>"; 
     console.log(test); 
    } 
}; 

提示:移动其他听众之外的点击事件侦听器,使它们运行得更好......

0

命名test变量是不确定的,当is_stopped是假的,因为它不是is_stoppped条件之外声明。

这会工作:

var test = null; // declare outside conditional 

if (is_stopped) { 
    test = localStorage.getItem('test'); 
}  

if (!is_stopped) { 
    console.log(test); // returns null 
} 
+0

不,js有功能范围 –

+0

@Jonasw是的...所以你有什么意见?将此代码放在'onmessage'处理程序中,它的行为将与注释中所述的相同。 – JasonK

+0

它*是*在有条件的 –

0

当你运行应用程序var is_stopped将被设置为false。

在这种情况下if (!is_stopped) {..}将被执行。 if (is_stopped) {..}将不会执行

由于主办var test将被悬挂到函数的顶部&那里它是未定义的。

test将只有if (is_stopped) {..}执行