在此代码中,我无法理解为什么如果我在第一个if条件成功插入断点fromCTA
我可以看到$form
变量而不是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();
});
:
fromCTA
代码工作正常,没有错误,请分析它只是为了回答我关于变量范围的问题:
在匿名函数中我可以在Chrome调试器中看到只关闭变量msg
和$form
,而我希望看到formArrSerialized
,len
和{{1} }。在我看来,所有这些都有相同的域名
答案 0 :(得分:2)
这就是调试器的工作方式。默认情况下,调试器仅显示当前范围中的变量。它不会在父作用域中显示变量。
但是,如果您为父作用域中的变量设置了一个观察点,例如$form
,您将能够看到它的值。
因此,这就是调试器的工作原理,与代码实际工作方式或Javascript实际工作方式无关。这可能是因为全局范围内可能存在很多变量,如果这些变量都包含在范围内的变量列表中,那么看到更多的局部变量就会变得复杂。
请记住,范围是分层的。虽然您在层次结构的一个级别询问某些变量,但是上面可能有更多级别的范围,然后它最终会到达包含所有全局变量的全局范围。因此,您所看到的实际上只是调试器中的UI选择。