每段代码前边都有功能注解和参数要求等说明文字,难度不大也就没做更多注释。 为看得清楚,这里依先后顺序做个小目录:
重写window.setTimeout,
理解递归程序的返回规律,
截取长字符串,
取得元素在页面中的绝对位置,
统计、去除重复字符(多种方法实现),
把有序的数组元素随机打乱(多种方法实现)。
代码如下:
/*
功能:修改 window.setTimeout,使之可以传递参数和对象参数 (同样可用于setInterval)
使用方法: setTimeout(回调函数,时间,参数1,...,参数n) (FF已经原生支持,IE不支持)
*/
var __sto = setTimeout;
window.setTimeout = function(callback,timeout,param){
var args = Array.prototype.slice.call(arguments,2);
var _cb = function(){
callback.apply(null,args);
}
__sto(_cb,timeout);
}
function aaaaa(a,b,c){
alert(a + b + c);
}
window.setTimeout(aaaaa,2000,5,6,7);
/**//*
功能:理解递归程序的返回规律(从内到外)
对象之间成员的互引用
*/
var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
alert(ninja.yell(4))//结果为:hiyaaaa;
var samurai = { yell: ninja.yell };
//var ninja = {}; // 此处 注释与否 对结果有影响
try {
alert(samurai.yell(4));
} catch(e){
alert("Uh, this isn't good! Where'd ninja.yell go?" );
}
/** 功能:截取长字符串
* @param {string} str 要截取的字符串
* @param {number} size 截取长度(单字节长度)
*/
var subStr = function(str, size){
var curSize = 0, arr = [];
for(var i = 0, len = str.length; i < len; i++){
arr.push(str.charAt(i));
if (str.charCodeAt(i) > 255){
curSize += 2;
if(size === curSize || size === curSize - 1){
return arr.join('');
}
}else{
curSize++;
if(size === curSize){
return arr.join('');
}
}
}
};
var str = '#%*……什么东西1234abcd 还不够长';
alert(str.length);
alert(str.substr(0, 15));
alert(subStr(str, 15));
/**//*
功能:取得元素在页面中的绝对位置(相对于页面左上角)
@param {string} node 待求位置的DOM元素
*/
function getAbsPosition(node) {
var t = node.offsetTop;
var l = node.offsetLeft;
while (node = node.offsetParent) {
t += node.offsetTop;
l += node.offsetLeft;
}
alert("top=" + t + "/n" + "left=" + l);
}
/**//*
功能:统计、去除重复字符
@param str 需要统计的字符串
说明:常用于字符串中重复字符,或者数组中重复的字母、数字等个数统计。
此处从网上收集两种典型的类型,分别有两种实现方法,其他还有许多变种,从不同角度编写,可搜索学习。
待统计的数据,不论是数组和字符串都可以,只用借助String.split()或 Array.join()
转换为函数参数要求的类型即可。