JavaScript中关于函数部分的代码总结(牛客网)

1.函数传参:

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

代码实现:

function argsAsArray(fn,arr){

  return fn.apply(this,arr);

}

说明:

  • apply()方法:劫持另外一个对象的方法,继承另外一个对象的属性。

语法:function.apply(obj,arguments);//即obj对象调用function对象的方法

接收两个参数:obj:这个对象将代替function类里this对象;arguments:这个是数组,将作为参数传给function;如果传递多个参数,则把参数都写进这个数组里面。

 

2.函数的上下文:

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

代码实现

function speak(fn,obj){

  return fn.call(obj);

  //return fn.apply(this,arguments);

}

说明

  • call()方法:和apply的意思一样,只是参数列表不一样。

语法:function.call(obj,[param1[,param2[,…[,paramN]]]]);

params是一个参数列表

  • 比较apply()和call()方法

共同之处:可以用来替代一个对象调用另一个对象,将一个函数的对象上下文从初始的上下文改变为由this指定的新对象。

apply()方法适合参数只有一个的,call()方法适合传递多个参数。

apply()的巧妙之处:可以将一个数组默认的转换成一个参数列表[param1,param2,param3]转换成param1,param2,param3。

 

3.使用闭包:

实现函数makeClosures,调用之后满足如下条件:

返回一个函数数组result,长度与arr相同;

运行result中第i个函数,即result[i](),结果与fn(arr[j])相同

代码实现:

function makeClosures(arr,fn){

  return arr.map(function(item){

    return function(){

      return fn(item);

    }

  });

}

说明

Map对象保存键值对。任何(对象或者原始值)都可以作为一个键或者一个值。

一个Map对象以插入顺序迭代元素——一个for…of循环为每次迭代返回一个[key,value]数组。

 

 

4.二次封装函数:

已知函数fn执行需要3个参数。请实现函数partial,调用之后满足如下条件:

返回一个函数result,该函数接受一个参数;

执行result(str3),返回的结果与fn(str1,str2,str3)一致。

代码实现:

function partial(fn,str1,str2){

  return function result(str3){

    return fn(str1,str2,str3);

  }

}

5.使用arguments:

函数useArguments可以接受1个及以上的参数。请实现函数useArguments,返回所有调用参数相加后的结果。

参考链接:https://blog.csdn.net/u013565133/article/details/70231082

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments

代码实现

思想:

Arguments类似一个数组,通过length属性来获得参数个数,通过下标获取该位置的参数,然后循环求和,得出结果。

function useArguments(){

  var sum = 0;

  for(var i in arguments){

    sum += arguments[i];

  }

  return sum;

}

②思想:

将arguments数组化,因为它是一个类数组。将伪数组转化成为一个真正的数组,就可以使用数组的方法进行相应的操作了。

代码实现:

function useArguments(){

  var arr = Array.prototype.slice.call(arguments);

  return eval(arr.join(“+”));//将数组中的每一项用+拼接起来,得到一个字符串,通过eval()函数计算得到和

}

说明:

  • arguments是一个对应于传递给函数的参数的类数组对象。

arguments对象是所有(非箭头)函数中都可用的局部变量。该对象不是一个Array,它类似于Array,但是除了length属性和索引元素之外没有任何Array属性。但是我们可以通过以下方式将它转化为数组:

var arr = Array.prototype.slice.call(arguments);

//var arr = [ ].slice.call(arguments);

//const arr = Array.from(arguments); ES2015中

对参数使用typeof会返回“object“。

 

属性:

arguments.callee:指向当前执行的函数

arguments.caller:指向调用当前函数的函数

  • eval()函数:用来计算某个字符串,并执行其中的JavaScript代码

语法:eval(string);string参数是必须的,要计算的字符串。

该方法只接受原始字符串作为参数,如果string参数不是原始的字符串,该方法不会有任何返回。

 

6.使用apply调用函数:

使用apply调用函数:实现函数callIt,调用之后满足如下条件:

返回的结果为调用fn之后的结果

fn的调用参数为callIt的第一个参数之后的全部参数

代码实现:

function callIt(fn){

  var arg = Array.prototype.slice.call(arguments,1);

  return fn.apply(null,arg);

}

7.二次封装函数:实现函数 partialUsingArguments,调用之后满足如下条件:
返回一个函数 result
调用 result 之后,返回的结果与调用函数 fn 的结果一致
fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数

代码实现:

function particalUsingArguments(fn){

  var arg1 = Array.prototype.slice.call(arguments,1);

  var result = function(){

    var arg2 = Array.prototype.slice.call(arguments);

    return fn.apply(null,arg1.concat(arg2));

  }

  return result;

}

8.柯里化:

已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件:
返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数)
调用 a 之后,返回一个函数 b, b 的 length 属性值为 1
调用 b 之后,返回一个函数 c, c 的 length 属性值为 1
调用 c 之后,返回的结果与调用 fn 的返回值一致
fn 的参数依次为函数 a, b, c 的调用参数

代码实现:

function curryIt(fn){

  return var a = function(fa){

    return var b = function(fb){

      return var c = function(fc){

        return fn(fa,fb,fc);

      }

    }

  }

说明:下一篇详细说明柯里化的内容。

注:js中函数这一部分比较难理解,我们一定要熟练使用apply()和call()这两种方法,arguments这个内置属性也很重要。

其中涉及到的闭包和柯里化也都是根重要的内容。闭包在面试中经常会涉及到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值