Javascript变量范围 - 被覆盖的局部变量

时间:2015-05-14 15:06:29

标签: javascript

我有以下代码段:

 function testFunction(selected) {
    console.log("Selected id is: " + selected);
    var sendData={
        id: selected[1],
        menu: true
    };
    console.log(sendData);
  }

当我第一次将此函数作为testFunction(1)运行时,我得到以下输出到控制台:

  

选择的ID是:1

     

sendData对象,在其中,id设置为1(正确),menu设置为true(正确),我有一些其他属性从某个地方添加到它,但我没有&#39 ; t从哪里知道

我第二次将它作为testFunction(2)运行时,我得到以下输出到控制台:

  

选择的ID是:2

     

sendData对象,在其中,id设置为1(不正确),menu设置为true(正确),以及额外添加的属性。

首先,我认为sendData变量是全局定义的(因为我在整个脚本中多次使用此变量名称),但是我搜索了整个脚本,并且没有函数将sendData作为全局变量访问(I意思是,无论我在哪里使用sendData,我都将其声明为var sendData)。即使是这种情况,根据我的理解,如果我在一个函数中使用" var"声明一个变量。关键字,它使它成为局部变量,因此没有全局变量应该干扰它。我错了吗?如果不是,导致此错误的问题可能是什么?

我仍在学习javascript中的变量范围,我还有另外一个问题。如果我将函数参数命名为例如" testVariable",并且我还有一个全局变量,名为" testVariable",每当我调用此函数并将一些参数传递给它时,我的全局变量变量立即改变了吗?

编辑:

以下是较大功能的实际代码段:

function mainSearchSelect(e) {
jQuery("#navbar_mobile_menu_button").removeClass('fa-bars').addClass('fa-spin').addClass('fa-spinner');
jQuery("#navbar_mobile_menu").removeClass("expanded");

var navEndFunction=function() {
        selectSelect2.find(".select2-icon").find("i").removeClass('fa-spinner').removeClass('fa-spin').addClass('fa-search');   
        jQuery("#navbar_mobile_menu_button").removeClass('fa-spinner').removeClass('fa-spin').addClass('fa-bars');  
}

var select=jQuery(e.currentTarget);
var selectSelect2=select.siblings(".select2");
var selected=e.params.args.data.id.split("-");
selectSelect2.find(".select2-icon").find("i").removeClass('fa-search').addClass('fa-spinner').addClass('fa-spin');
var navDat={
    pageData: {
        pageid: selected[1]
    }
};

console.log("Selected id is: " + selected[1]);
console.log(sendData);
var sendData={};
console.log(sendData);
sendData={
        id: selected[1],
        menu: true
};
console.log("Data being sent:");
console.log(sendData);
if (selected[0]=='CONT') {
    navDat['pageData']['page']='contacts';
    navDat['pageData']['module']='conversations';
    ConvNavigate.navigate('loadPage', navDat, 'contacts', sendData, null, navEndFunction);
} else if (selected[0]=='GROUP')
{
    navDat['pageData']['page']='groups';
    navDat['pageData']['module']='timeline';
    ConvNavigate.navigate('loadPage', navDat, 'groups', sendData, null, navEndFunction);
}
}

mainSearchSelect是一个由Select2插件调用的函数,当从中选择一个选项时。 e是正在发送的事件。

当我到达函数的这一部分时,控制台告诉我以下内容,我认为这真的很奇怪:

  

"选择的ID是:1"

     

未定义

     

对象{}

     

"正在发送的数据:"

     

对象{id:" 1",菜单:true,javascript:true,accessDat:" {" pageData":{" pageid":空,"页面":空,"模块":空,"的moduleId":空}"参数":["触点" {" ID":" 1""菜单":真},NULL,NULL]" urlData&#34 ;: {"标题":空," URL":空}" mobileData" {"标题":空,"菜单& #34;:空}" mobileTitle":" Converser"}" }

可能会发生什么?

我的脚本中的两个地方正在使用access dat属性: 第一个是发送到Select2的查询,第二个是添加到我向服务器发出的每个ajaxCall。

我控制台记录了e变量,并搜索了accessDat参数,如果它是从select2发回的,但它没有被发送回来,所以它不是来自添加它的e。 / p>

稍后会调用ajaxCall函数,这是我的函数所做的:

  

mainSearchSelect(e)中

     
    

使用select2进行选择,处理选择并使用所需参数调用ConvNavigate.navigate()函数时触发     在我们的案例中:

         
      

" loadPage" - 字符串,告诉函数完成后应该进行什么功能

             

navDat - 一个对象,将哪些属性发送到HistoryJS以更改页面的网址和标题

             

'触点' - 告诉loadPage它应该访问哪个php文件

             

sendData - 有问题的对象,也是发送到服务器进行处理的数据

             

null - 一个应该在加载loadPage时触发的启动回调函数 - 它为null,因为现在函数应该在加载时触发

             

navEndFunction - 一个结束回调函数,它应该在loadPage准备就绪时触发

    
  

这是loadPage函数:

function loadPage(page, sendData, startCallback, endCallback) {
if (startCallback === undefined) startCallback=null;
if (endCallback === undefined) endCallback=null;
if ((sendData === undefined) || (sendData === null)) sendData={};
sendData['javascript']=true;
console.log(sendData);

ajaxCall(baseUrl+"functions/"+page+".php", sendData, showPage, page, startCallback, endCallback);

}

请注意,此处的sendData几乎与之前的日志相同,但javascript:true会正确添加到其中。 ajaxCall函数将应该加载的文件,应该发送的数据,应该在ajaxCall准备好时触发的回调函数作为参数,最后三个参数是发送到回调函数的参数(page,startCallback) ,endCallback)。

如果它可以提供帮助,我也会写下功能showPage,但我不认为它与此问题有任何关系:|

如果我从ajaxCall函数注释掉sendData [' accessDat'],则accessDat不会在mainSearchSelect函数中记录到控制台。这就是将accessDat添加到我的对象的部分,但是怎么可能,ajaxCall稍后才被调用,即便如此,console.log已经知道将添加到它的什么?还有,什么将id重置为1? (或者它被分配给它的第一个值,因为如果我首先从选择框中选择id为3的选项,那么它会被卡住3)

2 个答案:

答案 0 :(得分:0)

您的脚本selected[1]可能有拼写错误。您可以将数字作为数组进行访问。然后sendData.id应始终设置为undefined。

答案 1 :(得分:0)

您正在发送一个整数,但您将其用作数组。 对象中的ID应始终未定义