实现计数器和函数操作

实现一个打点计时器,要求
1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作
3、第一个数需要立即输出

1.使用settimeout

function count(start, end) {
    if(start<=end) {
        console.log(start++);
        timer = setTimeout(function() {
        count(start, end)},100);
    }
    return {
        cancel: function() {
            clearTimeout(timer);
        }
    }
}

2. 用setinterval

function count(start, end) {
  //立即输出第一个值
  console.log(start++);
     var timer = setInterval(function(){
         if(start <= end){
             console.log(start++);
         }else{
             clearInterval(timer);
         }
     },100);
    //返回一个对象
     return {
         cancel : function(){
             clearInterval(timer);
         }
     };
 }

3. 将数组 arr 中的元素作为调用函数 fn 的参数

function argsAsArray(fn, arr) {
  return fn.apply(fn, arr);
}
//或者
function argsAsArray(fn, arr) {
  return fn.apply(this, arr);
}
显然这里用call ,非常不合理

function argsAsArray(fn, arr) {
  return fn.call(fn, arr[0],arr[1],arr[2]);
}
//或者
function argsAsArray(fn, arr) {
  return fn.call(this, arr[0],arr[1],arr[2]);
}

4. 将函数 fn 的执行上下文改为 obj 对象

/三种方案
//apply
function speak(fn, obj) {
    return fn.apply(obj);
}
//call
function speak(fn, obj) {
    return fn.call(obj);
}
//bind
function speak(fn, obj) {
    return fn.bind(obj)();
}

猜你喜欢

转载自www.cnblogs.com/sarah-wen/p/10767008.html