函数不修改传递的参数值

时间:2011-07-29 15:50:50

标签: javascript validation

我有以下功能:

function validateField(target, field, field_check) {
            if(target.val().trim().length > 0) {
                $.ajax({
                    url: '<?php echo $html->url('/fonykers/validate_',true); ?>'+ field + '/' + target.val(), 
                    dataType: 'json',
                    type: 'POST',
                    success: function(response) {
                        if(!response.ok) {
                            if(target.is('.ok')) {
                                target.removeClass('ok');
                            }
                            target.addClass('error');
                            error.html(response.msg);
                            error.fadeIn();
                            field_check = false;
                        } else {
                            if(target.is('.error')) {
                                target.removeClass('error');
                            }
                            target.addClass('ok');
                            alert('voy a asignar true');
                            field_check = true;
                        }
                    },
                        error:function (xhr, ajaxOptions, thrownError){
                            alert(xhr.statusText);
                            alert(thrownError);
                            field_check = false;
                        } 
                });        
            } else {
                error.html('You must specify a ' + field);
                error.fadeIn();
                target.addClass('error');
                field_check = false;
            } 

        }

我用它来验证我的表单输入字段,目标变量是字段本身,例如:$('#name_field')第二个变量是一个字符串,指定字段的名称,例如name知道它会调用哪些PHP函数。最后一个布尔值,我用来知道是否有效,或者现在该字段是否有效,例如我在脚本的开头定义的name_check并设置为false。

我的问题是field_check在本地范围内得到了适当的改变,但它永远不会修改已经传入的que外部变量,我做错了什么?

3 个答案:

答案 0 :(得分:2)

这是因为变量不是通过引用传递的。您可以将其作为返回值,也可以使用以下解决方法:http://sirdarckcat.blogspot.com/2007/07/passing-reference-to-javascript.html

答案 1 :(得分:1)

原始变量(int / boolean / etc)按值传递给函数 - 也就是说,当有人将其中一个传递给函数时,变量的值将传递给函数,而不是变量本身。你正在修改的是一个完全不同的变量。

最简单的解决方案是在完成字段验证后返回true或false,并使用函数的返回值而不是检查field_check

你也可以使用全局/属性做一些不同的事情。例如......

var validator = function (target, field) {
  ...
  this.field_check = false;
}

validator(target, field);
if (validator.field_check) {
  ...
}

注意使用this.field_check并将函数赋值给变量

答案 2 :(得分:0)

在JavaScript中,简单类型总是按值传递,而不是通过引用传递。换句话说,您传递的是布尔值的副本。副本得到改变,但原始的永远不会。

您的验证字段函数需要返回新值,或者需要一个将接收它的回调函数。您必须将新值显式设置为原始变量。