为什么setTimeout无法访问外部特定变量?

时间:2015-11-19 15:08:52

标签: javascript settimeout client-side

我发现了setTimeout的奇怪行为。我不知道为什么它能够从setTimeout之前声明的那些中正确选择一些变量值,而不是特定值。

this.RegisterForUpdateContents = function (intervalTime, FormControlGuid)
{        
    var layoutInfo = sessionStorage.getItem('LayoutInfo');            

    var panelName = "Panel_" + FormControlGuid;

    var timeOut = parseInt(intervalTime) * 1000;
    var self = this;

    var timeoutHandle = setTimeout(function ()
    {            
        var dashboardViewer = "dashboardViewer_" + FormControlGuid;
        console.log('Just sending callback for Update and LayoutInfo is  : ' + layoutInfo);

        var CallbackInfo = { 'selectedClientId': ClientId_HeaderSection.GetValue(), 'PanelName': panelName, 'Width': dockPanel.width, 'Height': dockPanel.height, 'dashboardViewer': dashboardViewer, 'UpdateTime': intervalTime, 'Layout': layoutInfo };  

    }, timeOut);


    sessionStorage.setItem((panelName + "|" + "Timeout"), timeoutHandle);
}

我可以访问panelName内容,但我不知道layoutInfo发生了什么。 layoutInfo始终为空""。但是如果我从setTimeout访问sessionStorage.getItem('LayoutInfo')内部,则可以访问。

有人知道为什么吗?

修改

$.each(keys, function (index, singlePanel)
{
  sessionStorage.setItem(singlePanel, JSON.stringify(panelRenderingInfo));
  if (UpdateTime)
      selfInstance.RegisterForUpdateContents(UpdateTime, FormControlGuid);
});

var LayoutVSClient = { 'CurrentLayout':    selectedLayout,'selectedClientValue': ClientId_HeaderSection.GetValue() };
sessionStorage.setItem('LayoutInfo', JSON.stringify(LayoutVSClient));

2 个答案:

答案 0 :(得分:3)

我刚刚在JSFiddle中重新创建了您的代码。

testTimeout = function (intervalTime, formControlGuid)
{        
    var layoutInfo = sessionStorage.getItem('LayoutInfo');            

    var panelName = "Panel_" + formControlGuid;

    var timeOut = parseInt(intervalTime) * 1000;
    var self = this;

    var timeoutHandle = setTimeout(function ()
    {            
        var dashboardViewer = "dashboardViewer_" + formControlGuid;
        console.log('Just sending callback for Update and LayoutInfo is  : ' + layoutInfo);

        var CallbackInfo = { 'selectedClientId': 'client-header-section-value', 'PanelName': panelName, 'Width': dockPanel.width, 'Height': dockPanel.height, 'dashboardViewer': dashboardViewer, 'UpdateTime': intervalTime, 'Layout': layoutInfo };  

    }, timeOut);


    sessionStorage.setItem((panelName + "|" + "Timeout"), timeoutHandle);
}

var dockPanel = { width:50, height:60 };
sessionStorage.setItem('LayoutInfo', 'layoutInfoContent');
testTimeout(2, '325609e6-51bd-4c69-9613-be0b36b7e2a1');

使用此示例,我无法复制您描述的问题。您是否有一行代码来设置sessionStorage?示例:

sessionStorage.setItem('LayoutInfo', 'layoutInfoContent');

<强> === EDIT ===

@ Uston,您是否可以将上面新编辑的代码更改为以下内容:

var LayoutVSClient = { 'CurrentLayout':    selectedLayout,'selectedClientValue': ClientId_HeaderSection.GetValue() };
sessionStorage.setItem('LayoutInfo', JSON.stringify(LayoutVSClient));

$.each(keys, function (index, singlePanel)
{
  sessionStorage.setItem(singlePanel, JSON.stringify(panelRenderingInfo));
  if (UpdateTime)
      selfInstance.RegisterForUpdateContents(UpdateTime, FormControlGuid);
});

答案 1 :(得分:0)

我认出了我的错误!!

在调用RegisterForUpdateContents之前,我必须使用LayoutInfo键设置sessionStorage。 @Ant:谢谢你的观点。