1

我已经使用 jQuery 一年了,但我仍然不明白这段代码是如何工作的:

alert($('#elementID').val()); // It gets the value of element

$('#elementID').val('setting Value'); // the same function is setting value

jquery的其他一些功能也做同样的事情.html()

我想知道这个东西是怎么实现的?他们如何重载javascript函数?

4

5 回答 5

8

javascript 中没有重载,所以像这样的功能是使用可选参数执行的。JavaScript 允许您在不指定参数的情况下调用函数。例如:

function val(text)
{
  if (arguments != null && arguments.length > 0) {
    alert("i'm setting value here to " + text);
  } else {
    alert("i'm getting value here");
  }
}

val(); // alerts value getter
val('hi!'); // alerts value setter and the message

编写此示例是为了指出您在每个函数中获得的参数集合。每个函数都可以将它的参数作为一个集合来获取,并可以相应地执行它的逻辑。但是,显示的示例在现实世界中会以不同的方式编写:

function val(text)
{
  if (typeof text === "string") {
    alert("i'm setting value here to " + text);
  } else {
    alert("i'm getting value here");
  }
}

您没有传递给函数的每个参数都会获得undefined(不是null)的“值”。这使您可以使用最短的逻辑表达式。if您可以在语句中使用任何值。null被或undefined将被简单地评估为的变量false

正如下面的评论所指出的,如果text参数为空字符串if (text)将返回 false。因此,对于文本参数,请按类型检查参数。

阅读有关nullundefined差异对您也很有帮助。

于 2012-08-25T10:02:17.750 回答
5

只需检查函数是否使用参数调用即可完成

function stuff(moreStuff){
   if(typeof moreStuff === "undefined"){
      return originalStuff;
   }else{
      setStuff(moreStuff);
   }
}
于 2012-08-25T09:59:28.310 回答
3

很简单,只要检查变量是否有值:

function foo(param) {
    // Method 1
    if (param != null) {
        // Parameter is defined
    } else {
        // No parameter (or null given)
    }

    // Method 2
    if (arguments.length > 0) {
        // At least one argument has been defined
    }
}
于 2012-08-25T10:00:37.223 回答
1
function foo(value)
{
     if(typeof value != 'undefined')
     {
         // calling foo(2332)
     }
     else
     {
         // foo()
     }
}
于 2012-08-25T10:00:11.747 回答
1

正如几乎所有其他人提到的那样,他们没有重载参数,但在第一条语句中,没有为函数提供参数。但是,在第二个中,已经提供了一个论点。因此,一个简单的检查typeof something == "undefined"可以很容易地修改和区分不同的结果。

这是组成.val()函数的相关 jQuery 代码(版本 1.8.0):

val: function( value ) {
        var hooks, ret, isFunction,
            elem = this[0];

        if ( !arguments.length ) {
            if ( elem ) {
                hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];

                if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
                    return ret;
                }

                ret = elem.value;

                return typeof ret === "string" ?
                    // handle most common string cases
                    ret.replace(rreturn, "") :
                    // handle cases where value is null/undef or number
                    ret == null ? "" : ret;
            }

            return;
        }

        isFunction = jQuery.isFunction( value );

        return this.each(function( i ) {
            var val,
                self = jQuery(this);

            if ( this.nodeType !== 1 ) {
                return;
            }

            if ( isFunction ) {
                val = value.call( this, i, self.val() );
            } else {
                val = value;
            }

            // Treat null/undefined as ""; convert numbers to string
            if ( val == null ) {
                val = "";
            } else if ( typeof val === "number" ) {
                val += "";
            } else if ( jQuery.isArray( val ) ) {
                val = jQuery.map(val, function ( value ) {
                    return value == null ? "" : value + "";
                });
            }

            hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];

            // If set returns undefined, fall back to normal setting
            if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
                this.value = val;
            }
        });
    }
于 2012-08-25T10:06:58.890 回答