我已经使用 jQuery 一年了,但我仍然不明白这段代码是如何工作的:
alert($('#elementID').val()); // It gets the value of element
$('#elementID').val('setting Value'); // the same function is setting value
jquery的其他一些功能也做同样的事情.html()
我想知道这个东西是怎么实现的?他们如何重载javascript函数?
我已经使用 jQuery 一年了,但我仍然不明白这段代码是如何工作的:
alert($('#elementID').val()); // It gets the value of element
$('#elementID').val('setting Value'); // the same function is setting value
jquery的其他一些功能也做同样的事情.html()
我想知道这个东西是怎么实现的?他们如何重载javascript函数?
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。因此,对于文本参数,请按类型检查参数。
阅读有关null
和undefined
差异对您也很有帮助。
只需检查函数是否使用参数调用即可完成
function stuff(moreStuff){
if(typeof moreStuff === "undefined"){
return originalStuff;
}else{
setStuff(moreStuff);
}
}
很简单,只要检查变量是否有值:
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
}
}
function foo(value)
{
if(typeof value != 'undefined')
{
// calling foo(2332)
}
else
{
// foo()
}
}
正如几乎所有其他人提到的那样,他们没有重载参数,但在第一条语句中,没有为函数提供参数。但是,在第二个中,已经提供了一个论点。因此,一个简单的检查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;
}
});
}