[转载]淘宝Kissy框架分析【五】 – BlueDream – 博客园.
继续分析kissy-lang.js
8.makeArray函数
作用:转化类数组对象为真实的数组.
原理:主要需要处理的就是将NodeList转化成真实的数组. 在非IE浏览器都可以通过Array.prototype.slice.call(NodeList)来直接转换.但IE却不支持.
所以IE下只能降级到普通的方法转换.
测试用例:
<script>
(function(J) {
J.log(J.makeArray(‘a‘)); // [‘a’]
J.log(J.makeArray(function a() {})); // [‘a()’]
J.log(J.makeArray([‘a‘, ‘b‘])); // [‘a’, ‘b’]
J.log(J.makeArray(null)); // []
var odiv = document.getElementsByTagName(‘div‘);
J.log(J.makeArray(odiv)); // [‘divElement’, ‘divElement’, ‘divElement’, ‘divElement’]
})(J1616);
</script>
9.filter函数
作用:通过回调函数的条件过滤数组项.
测试用例:
J.log(J.filter([1, 34, 45, 3, 4], function(item) {
return item > 10; // 过滤大于10的数组项
})); // [34, 45]
J.log(J.filter([1, 34, 45, 3, 4], function(item, index) {
return index > 2; // 过滤索引大于2的数组项
})); // [3, 4]
})(J1616);
10.param函数
作用:将一个hash类型序列化成有效的url格式串形式.
测试用例:
// 普通字符串
var url1 = {‘name‘: ‘j16‘, ‘age‘: ‘23‘, ‘sex‘: ‘men‘};
J.log(J.param(url1)); // name=j16&age=23&sex=men
// 空字符串
var url2 = {‘name‘: ”, ‘age‘: ”, ‘sex‘: ‘men‘};
J.log(J.param(url2)); // name=&age=&sex=men
// 数组类型字符串
var url3 = {‘name‘: [‘j16‘, ‘kissy‘], ‘age‘: ‘23‘, ‘sex‘: [‘women‘, ‘men‘]};
J.log(J.param(url3)); // name[]=j16&name[]=kissy&age=23&sex[]=women&sex[]=men
})(J1616);
11.unparam函数
作用:param函数的逆转换(将url序列成hash对象). 但由于国情的原因.并不是完全可逆的.decodeURIComponent只能处理UTF-8编码的的中文. 而不能处理gbk编码的中文.
12.later函数
作用: 延迟函数. 在指定的时间内 执行一段函数(setTimeout). 或者在指定的时间内 重复的执行一段函数(setInterval).
测试用例:
var i = 0;
var intervalRun = function(a, b, c) {
if (++i >= 10) {
timer.cancel();
}
J.log(i + ‘ times run\‘s params is: ‘ + [a, b, c]);
};
// 每个1秒 调用intervalRun函数. 并传入参数. 超过10次便停止
var timer = J.later(intervalRun, 1000/*1s*/, true/*setInterval*/, null/*context*/, [‘a‘, ‘b‘, ‘c‘]);
var timeoutRun = function(param) {
J.log(
};
// 1秒后 调用一次timeoutRun函数. 并传入参数
J.later(timeoutRun, 1000, false, null, ‘setTimeout‘);
})(J1616);
13.now函数
作用:返回当前时间戳.
注意: kissy使用比较普通的new Date().getTime(). 有的框架用了高级浏览器支持的Date.now() || +new Data(比如mootools)但这个无所谓.清晰性更重要.
14.globalEval函数
作用:在全局范围内执行代码
原理:kissy使用了script.text. 但貌似opera最新版本会有点问题. 全局执行代码有几个方法.具体可以参考司徒的这篇文章.
测试用例:
var i = ‘local‘;
J.globalEval(‘var j = “global”‘);
})(J1616);
alert(j); // 由于globalEval函数可以冲破局部.所以可以得到j ==> global
alert(i); // 由于i在闭包内. 所以是局部的 无法取到 而报错
至此kiss-lang.js部分分解完毕.接下来的是kissy-ua.js.