澄清javascript范围

时间:2016-03-08 23:08:59

标签: javascript scope closures

在此代码中,我无法理解为什么如果我在第一个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,而我希望看到formArrSerializedlen和{{1} }。在我看来,所有这些都有相同的域名

1 个答案:

答案 0 :(得分:2)

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

但是,如果您为父作用域中的变量设置了一个观察点,例如$form,您将能够看到它的值。

因此,这就是调试器的工作原理,与代码实际工作方式或Javascript实际工作方式无关。这可能是因为全局范围内可能存在很多变量,如果这些变量都包含在范围内的变量列表中,那么看到更多的局部变量就会变得复杂。

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