至于 coverntFn 是一函数参数。通过根函数 translateText(text, isBig5) 新生成两个函数 :var traditionalized = translateText.delegate(null, true), simplized = translateText.delegate(null, false);
function translateText(text, isBig5) { var str = [], _char, charIndex, result; for (var i = 0, j = text.length; i < j; i++) { _char = text.charAt(i); charIndex = isBig5 ? 简化中文.indexOf(_char) : 正体中文.indexOf(_char); result = isBig5 ? 正体中文.charAt(charIndex) : 简化中文.charAt(charIndex); str.push(charIndex != -1 ? result : _char); } return str.join(''); } var traditionalized = translateText.delegate(null, true), simplized = translateText.delegate(null, false);
Function.prototype.delegate() 方法如下。
/** * 函数委托 * @return {Function} */ Function.prototype.delegate = function () { var self = this, scope = this.scope, args = arguments, aLength = arguments.length, fnToken = 'function'; return function(){ var bLength = arguments.length, Length = (aLength > bLength) ? aLength : bLength; // mission one: for (var i = 0; i < Length; i++) if (arguments[i])args[i] = arguments[i]; // 拷贝参数 args.length = Length; // 在 MS jscript下面,arguments作为数字来使用还是有问题,就是length不能自动更新。修正如左: // mission two: for (var i = 0, j = args.length; i < j; i++) { var _arg = args[i]; if (_arg && typeof _arg == fnToken && _arg.late == true) args[i] = _arg.apply(scope || this, args); } return self.apply(scope || this, args); }; };