2016-03-08 57 views
0

在此代码,我不明白为什么,如果我插入一个断点第一如果成功if(data == 1){条件,我可以看到fromCTA变量,但不$form澄清JavaScript的范围

jQuery('.pane-tab form, form#hlp_contactCTA').on('click','.input-submit',function(e){ 
    var $form = jQuery(this).parent('form'); 
    var fromCTA = false; 
    var formArrSerialized = $form.serializeArray(); 
    var len = formArrSerialized.length; 
    for(var i=0; i<len; i++){ 
     if(formArrSerialized[i].name == 'message'){ 
      var msg = formArrSerialized[i].value; 
     }     
    } 
    if(msg){ 
     if(!$form.is('#msg-form')){ //we are in user account 
      fromCTA = true; 
      //formArrSerialized.push({name:'fromCTA', value: 1}); 
     } 
     formArrSerialized.push({name:'action', value:'send_message'}); 

     var param = jQuery.param(formArrSerialized); 
     jQuery.ajax({ 
      url:pathToAjax() + 'wp-admin/admin-ajax.php', 
      data:param, 
      type:'POST', 
      success: function(data){ 
       if(data == 1){ 
        if(!fromCTA){ 
         appendMsg(msg); 
        } else { 
         showMsg('Il messaggio è stato inviato',2000,function(){jQuery('#popup-contactCTA').hide();}); 
        }     
       } else { 
        console.log('qualcosa è andato storto'); 
       }; 
      }, 
      error: function(){ 
       console.log('error');    
      } 
     }); 
    } 

    e.preventDefault(); 
}); 

代码工作正常有没有错误,请分析一下才回答我的问题,这方面的变量范围:
在匿名函数中的成功,我可以在Chrome调试器中看到的只是一个封闭的可变fromCTAmsg,而我期望看到$formformArrSerializedlen。他们在我看来都具有相同的域

回答

2

这只是调试器的工作方式。默认情况下,调试器仅向您显示当前范围中的变量。它不会在父范围中显示变量。

但是,如果您在父范围内为变量设置了一个观察点,例如$form,您将能够看到它的值。

所以,这只是调试器的工作方式,并且与代码的实际工作方式或Javascript实际工作方式无关。这可能是因为在全局范围内可能有很多变量,并且如果这些变量都包含在范围内的变量列表中,看起来更多的局部变量确实会变得复杂。

请记住,范围是分层的。当您在层次结构的上一层查询某些变量时,上面的范围可能会有更多级别,然后它将最终到达全局范围,其中将包含所有全局变量。所以,你所看到的实际上只是调试器中的UI选择。