标签:
在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基本差不多,就是传参数的形式有所不同,小伙伴们自己去了解了解吧。
标签:
原文地址:http://www.cnblogs.com/brianwong/p/4445703.html