//在数组 arr 中,查找值与 item 相等的元素出现的所有位置 function findAllOccurrences(arr, target) { var res = []; for(var i=0;i<arr.length;i++){ if(arr[i] == target){ res.push(i) } } return res }
//实现一个打点计时器,要求 //1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一//个数字,每次数字增幅为 1 //2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作 //3、第一个数需要立即输出 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) } } }
//将数组 arr 中的元素作为调用函数 fn 的参数 function argsAsArray(fn, arr) { return fn.apply(this,arr) }
//将函数 fn 的执行上下文改为 obj 对象 //在JavaScript中,函数是一种对象,其上下文是可以变化的,对应的,函数内//的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另//一个对象的方法,可以通过Function对象中的call或者apply方法来修改函//数的上下文,函数中的this指针将被替换为call或者apply的第一个参数。将//函数 fn 的执行上下文改为 obj 对象,只需要将obj作为call或者apply的第//一个参数传入即可。 function speak(fn, obj) { return fn.call(obj) }
//实现函数 makeClosures,调用之后满足如下条件: //1、返回一个函数数组 result,长度与 arr 相同 //2、运行 result 中第 i 个函数,即 result[i](),结果与 fn(arr[i]) 相同 //在《JavaScript高级程序设计》书中提到的最典型的解决此问题的方法就//是用一个立即执行的匿名函数代替闭包负值给数组,这个匿名函数有一//个参数num,因为函数参数是按值传递的所以传递给num的就是当前//for循环的值 function makeClosures(arr, fn) { var result = new Array(); for(var i=0;i<arr.length;i++){ result[i] = function(num){ return function(){ return fn(num); } }(arr[i]); } return result; }