面试题目
一、
复制代码 代码如下:
请定义这样一个函数
function repeat (func, times, wait) {
}
这个函数能返回一个新函数,比如这样用
var repeatedfun = repeat(alert, 10, 5000)
调用这个 repeatedfun (hellworld)
会alert十次 helloworld, 每次间隔5秒
二、
复制代码 代码如下:
写一个函数stringconcat, 要求能
var result1 = stringconcat(a, b) result1 = a+b
var stringconcatwithprefix = stringconcat.prefix(hellworld);
var result2 = stringconcatwithprefix(a, b) result2 = hellworld+a+b
小菜解法
这两道题,考的就是闭包,废话不多说,直接上代码。
复制代码 代码如下:
/**
* 第一题
* @param func
* @param times
* @param wait
* @returns {repeatimpl}
*/
function repeat (func, times, wait) {
//不用匿名函数是为了方便调试
function repeatimpl(){
var handle,
_arguments = arguments,
i = 0;
handle = setinterval(function(){
i = i + 1;
//到达指定次数取消定时器
if(i === times){
clearinterval(handle);
return;
}
func.apply(null, _arguments);
},wait);
}
return repeatimpl;
}
//测试用例
var repeatfun = repeat(alert, 4, 3000);
repeatfun(hellworld);
/**
* 第二题
* @returns {string}
*/
function stringconcat(){
var result = [];
stringconcat.merge.call(null, result, arguments);
return result.join(+);
}
stringconcat.prefix = function(){
var _arguments = [],
_this = this;
_this.merge.call(null, _arguments, arguments);
return function(){
var _args = _arguments.slice(0);
_this.merge.call(null, _args, arguments);
return _this.apply(null, _args);
};
};
stringconcat.merge = function(array, arraylike){
var i = 0;
for(i = 0; i array.push(arraylike[i]);
}
}
//测试用例
var result1 = stringconcat(a, b); //result1 = a+b
var result3 = stringconcat(c, d); //result1 = a+b
var stringconcatwithprefix = stringconcat.prefix(hellworld);
var stringconcatwithprefix1 = stringconcat.prefix(hellworld1);
var result2 = stringconcatwithprefix(a, b); //result2 = hellworld+a+b
var result4 = stringconcatwithprefix1(c, d); //result2 = hellworld+a+b
alert(result1);
alert(result2);
alert(result3);
alert(result4);