这个函数是一个抽象的方法,很多对外暴露的方法,最终都调用这个方法。
access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
var exec,
bulk = key == null, //是不是传了key进来
i = 0,
length = elems.length;
// Sets many values 对于attr函数,处理传了attr({})的情况,chainable=1为链式
if ( key && typeof key === "object" ) {
for ( i in key ) {
jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); //i为key,key[i]是value,递归
}
chainable = 1;
// Sets one value
} else if ( value !== undefined ) {
// Optionally, function values get executed if exec is true
exec = pass === undefined && jQuery.isFunction( value ); //没有传递pass并且value是一个function
if ( bulk ) { //对于传了none或者undefined的情况
// Bulk operations only iterate when executing function values
if ( exec ) {
exec = fn;
fn = function( elem, key, value ) {
return exec.call( jQuery( elem ), value );
};
// Otherwise they run against the entire set
} else {
fn.call( elems, value ); //直接set
fn = null;
}
}
if ( fn ) {
for (; i < length; i++ ) {
//如果value不是函数 fn(elems[i], key,value);
//如果value是函数:fn(elems[i], key,value.call( elems[i], i, fn( elems[i], key )));
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );//在attr中,执行attr的函数,传递key,如果value是func,则按照value执行
}
}
chainable = 1;
}
return chainable ? //是不是sets,不是的话,传递的key,value是不是有效,然后执行set的操作,否则返回空
elems :
// Gets
bulk ?
fn.call( elems ) :
length ? fn( elems[0], key ) : emptyGet;
},