如何使程序更高效的执行?

Posted on 2015-04-21 22:30  BrianWong  阅读(285)  评论(0)    收藏  举报

在codewars网站做题,做到一下一道题。

var add = function (a, b) { 
return a + b; 
};
var lazy_sum = make_lazy(add, 2, 3);
Test.expect(lazy_sum() === 5, 'Evaluates the expression when required');//这个是codewars网站特有的测试代码,自己运行要另行写
var double = function (n) { 
return n * 2; 
}; 
var lazy_value = make_lazy(double, 5);
Test.expect(lazy_value() === 10, 'Evaluates the expression when required');
var superAdd = function () {
return Array.prototype.slice.apply(arguments).reduce(function (a, c) {
return a + c; }, 0);
};
var lazy_superSum = make_lazy(superAdd, 1, 2, 3, 4, 5);
Test.expect(lazy_superSum() === 15, 'Evaluates the expression when required');

要我写一个make_lazy函数要使上面的代码能运行通过,然后我最后的答案是这样

var make_lazy = function () {
  // TODO: implement this function
  var arg = arguments; 
  return function(){
  return arg[0].apply(this,Array.prototype.slice.call(arg,1));
  }
};

是可以成功运行的。可是我还不明白就是它到底如何使程序更高效了。

不过通过这道题我对函数的参数arguments有了更深的理解,还有就是apply()函数的真正强大之处。

从上面我写得make_lazy函数可以看到,arguments参数返回的是一个object数组,不是string也不是array,可是slice()方法是array特有的,那么我又要想对这个arguments对象进行操作,这个时候apply()就能发挥用处,它能使用这个对象原本并没有的方法。简单一点的例子就是

var obj1 = {
    var x = 1;
    var a_ fuc = function(arg){
       alert(arg);
    }
};
var obj2 = {
    var x = 1;
    var b_fuc = function(arg){
        console.log(arg);
    }
};
var a = obj1;
var b = obj2;
a.a_fuc.apply(b,2);

a其实是没有定义a_fuc的方法,可是却能够调用,这就是apply的强大之处,call和apply基本差不多,就是传参数的形式有所不同,小伙伴们自己去了解了解吧。