— Designsor

Archive
Tag "JavaScript基础扩展题"

啊,群里为了帮助我提高js水平,出了道比较考察基础的题目,他们说蝴蝶书里有答案,我确实忘记了,也不知道写的对不对,但是测试了下,代码还算完善。

题是这样的:

/*
Whyme 14:49:13
JS中假如Function.prototype.call不存在
但Function.prototype.apply存在
试用后者实现前者.(其余js 1.5特性也具备)
*/

我写了2个版本,第一个有点错,就不发了。。第2个发出来看下:

Function.prototype.call=function(){
var type=typeof arguments[0] == ‘function’ || typeof arguments[0] == ‘object’;
switch (arguments.length){
case 0:
return this.apply();
break;
case 1:
if(type){
return this.apply(arguments[0]);
}else{
throw new Error(arguments[0]+’ is not provide’);
}
break;
default:
if(type){
var ary = [];
for (var i = 0; i < arguments.length; i++) {
ary.push(arguments[i + 1]);
}
return this.apply(arguments[0], ary);
}else{
throw new Error(arguments[0]+’ is not provide’);
}
};
};

简单的测试了下……再简化我就不知道怎么写了。。。

经过又20分钟的思考。得到下面精简版本- -||

Function.prototype.call = function(){
var type=typeof arguments[0] == ‘function’ || typeof arguments[0] == ‘object’ || arguments[0]!=’undefined’;
if (type){
var ary = [];
for (var i = 0; i < arguments.length; i++) {
ary.push(arguments[i + 1]);
}
return this.apply(arguments[0], ary);
}else{
throw new Error(arguments[0]+’ is undefined’);
}
};

期待更精简的。特此记录。。。

史努比的:(没经测试……)

Function.prototype.call = (function() {
var slice = Array.prototype.slice;
return function () {
var args = slice.apply(arguments)
, context = args.shift();
return this.apply(context, args);
}
})();

确实比我的短……哎- -忘记用array对象里的那几个方法了……//但是我认为他没对thisObj做检查,应该可能是个隐患- -?

最后的结果是没有类型检查半毛钱关系,异常全部交给apply处理,截取参数数组使用array对象的方法,完事。我想太多了。。。不好意思- -||

Read More