【问题标题】:Clarification on javascript scope澄清 javascript 范围
【发布时间】:2016-03-08 23:08:58
【问题描述】:

在这段代码中我不明白为什么如果我在第一个 if 条件成功插入断点if(data == 1){ 我可以看到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();
});  

代码工作正常,没有错误,请分析它只是为了回答我关于变量范围的问题:
在成功的匿名函数中,我可以在 Chrome 调试器中看到只有变量 fromCTAmsg 的闭包,而我希望看到 $formformArrSerializedlen。我认为它们都具有相同的域

【问题讨论】:

    标签: javascript scope closures


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 2014-04-09
      • 2011-04-18
      • 2016-03-13
      • 2019-01-13
      • 1970-01-01
      • 2015-10-06
      • 2021-08-11
      • 1970-01-01
      相关资源
      最近更新 更多