JS返回值题一直都是考察重点,面试和笔试之中也经常涉及到,说一说我最近遇到的一些有意思的JS返回函数问题。

之前见到过一道有意思的问题,说有一个sum函数,用户可以通过sum(2,3)来取到2+3 = 5 的结果,但是有的用户会出现失误的操作,有可能错误的写成sum(2)(3),现在要求增加客户的容错率,让sum(2)(3)也能够正确的返回结果。

思路:sum(2,3)就是函数传入了两个参数2和3然后能够返回2+3这个结果,而sum(2)(3)则是传入2之后得到一个结果,然后再次传入3最后得到2+3这个正确结果,也就是说函数要多执行一次,因此如果传入2就要返回一个函数,这里可以这么写:

  1. function sum(num1,num2)
    {
    if(num2 == undefined){
    return function(num){
    return num1 + num;
    }
    }else{
    return num1 + num2;
    }
    }
  2.  
  3. console.log(sum(2,3)); //5
    console.log(sum(2)(3)); //5
  4.  
  5. 还有一道比较有意思的问题是说once这个只执行一次的函数,题目要求传入一个函数对它进行包装,要求返回的结果不管执行几次只会返回第一次的结果。例如:
  6.  
  7. g = once(func);
    g(2); //func(2)的结果
    g(3); //还是func(2)的结果
  8.  
  9. 思路:这道题不用说肯定需要一个全局变量来判断函数时候执行过,需要一个数据来存放第一次执行的结果,根据前一个变量来判断是否执行过,如果没有执行后返回结果,如果执行过则不需要再次执行,直接返回第一次的结果。这题一个考察点是全局变量的控制,还有一个考察点就是怎么利用这个传入的func来得到结果。话不多说,直接上代码:
  1. function fn(num)
    {
    return num*num;
    }
    function once(func)
    {
    if(typeof func != "function"){
    alert("请传入函数类型");
    }
    flag =true;
    window.result;
    return function() {
    if (flag) {
    result = func.apply(this, arguments);
    flag = false;
    return result;
    } else {
    return result;
    }
    }
    }
  2.  
  3. g = once(fn);
    console.log(g(2)); //4
    console.log(g(3)); //4
  4.  
  5. 这里注意运用apply传入arguments来调用funcarguments是一个function特有的属性,表示的是传入的所有参数,是一个类数组但不是真正意义上的数组,如果想将它转换成数组可以使用:
  6.  
  7. Array.prototype.slice.call(arguments);
  8.  
  9. 这里还要说一下关于apply的相关知识,函数一般改变this上下文有三种方法:call()、apply()和bind()
    call()和apply()差不多,如果都是传入一个参数的话它俩是一样的,如果传入多个参数,apply(this,arr)的第二个参数是一个数组,也就是你需要传入的各个参数组成的数组,而call(this,a,b)后面跟的是需要传入的各个属性。这两个最后得到的是改变this之后函数的执行结果。
    bind()是ES5中加入的一个方法这个是直接将一个对象绑定到函数中,返回一个新的函数,这个函数里面的this属性会始终指向绑定的对象。

最近见到的JS返回函数的一些题的更多相关文章

  1. js返回函数, 函数名后带多个括号的用法及join()的注意事项

    内容 题目描述 输入 输出 题目描述 实现函数 functionFunction,调用之后满足如下条件: 1.返回值为一个函数 f 2.调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英 ...

  2. 一道面试题:js返回函数, 函数名后带多个括号的用法及join()的注意事项

    博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/11/13/js%E8%BF%94%E5%9B%9E%E5%87%BD%E6%95%B0%E ...

  3. JS中函数参数和函数返回值的理解

    函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...

  4. JS异步函数 返回值

    1.  js 异步的几种情况 : 1.1 异步操作由浏览器内核的 webcore 来执行: onclick 由浏览器内核的 DOM Binding 模块来处理,当事件触发的时候,回调函数会立即添加到任 ...

  5. js valueOf()函数用于返回指定对象的原始值

    valueOf()函数用于返回指定对象的原始值. 该方法属于Object对象,由于所有的对象都"继承"了Object的对象实例,因此几乎所有的实例对象都可以使用该方法. 对象 返回 ...

  6. JS进阶-特殊形式的函数-返回函数的函数/重写自己的函数

    返回函数的函数 // 返回函数的函数 function a() { alert("aa"); return function () { alert("bb"); ...

  7. 【转】关于URL编码/javascript/js url 编码/url的三个js编码函数

    来源:http://www.cnblogs.com/huzi007/p/4174519.html 关于URL编码/javascript/js url 编码/url的三个js编码函数escape(),e ...

  8. prototype.js $F()函数介绍

    $F()是一个能够简化编码量的函数, 对于字段输入控件有效,包括input.textarea.select等,该函数的输入参数为这些输入控件元素对象的id或元素对象本身,函数负责返回 这些输入控件元素 ...

  9. JS匿名函数的理解

    js匿名函数的代码如下:(function(){ // 这里忽略jQuery 所有实现 })(); 半年前初次接触jQuery 的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的 ...

随机推荐

  1. jsp EL表达式和JSTL标签if-else if-else用法

    java web javaEE ,jsp EL表达式和JSTL标签if-else if-else四种用法一.条件运算符 ${user.gender==?'男':'女'} 二.if() <c:if ...

  2. [补档]暑假集训D4总结

    考试 爆零了,不开心,打了两道自己以为是正解的东西,打了两道样例骗分,结果发现并没有给样例分= =,自己以为的正解也打挂了,所以就很= = 但是没办法啊,自己弱也不能怪谁,考试这东西有时候也很玄学. ...

  3. 使用Node.js调用阿里云短信的发送以及接收

    为了使用Node.js调用阿里云短信服务,我自己写了个npm包, 目前实现了: 使用Node.js调用阿里云短信服务,发送短信: 使用Node.js调用阿里云短信服务以及MNS服务,接收用户上行短信 ...

  4. C#使用Xamarin开发可移植移动应用(1.入门与Xamarin.Forms页面),附源码

    前言 什么是Xamarin? Xamarin始创于2011年,旨在使移动开发变得难以置信地迅捷和简单. Xamarin的产品简化了针对多种平台的应用开发,包括iOS.Android.Windows P ...

  5. python进阶(3):模块和包

    之前两天我们介绍了一些比较常用的模块,而我也说过会讲解什么是模块,今天我们就来分析分析模块和包,模块我们现阶段使用还可以而包的话现阶段我们基本很少会用到包,学的不是很清楚也没关系这些东西都是用的多了也 ...

  6. NYOJ--325--深度优先搜索--zb的生日

    /* Name: NYOJ--325--zb的生日 Author: shen_渊 Date: 15/04/17 08:18 Description: 输入时计算总质量,DFS搜索和总质量差值一般最接近 ...

  7. 放开那个UI 妹子,让我来(上)

    一.前言 今天要学习的内容:今天主要是稍微总结一下,页面中如何用字体代替图片,省事,省时,方便,实用! 小苏啰嗦:人都是有惰性的.真的.刚开始我们有一个经验丰富的美工,加上我们关系又非常好,以至于每次 ...

  8. python_装饰器_语法糖

    什么是高阶函数? -- 把函数名当做参数传给另外一个函数,在另外一个函数中通过参数调用执行 #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog ...

  9. DataGuard实战1

    DataGuard实战1 -------------------------------------------2013/10/27   一.Primary数据库的配置及操作 1. 确定主库处于归档日 ...

  10. Netty笔记——技术点汇总

    目录 · Linux网络IO模型 · 文件描述符 · 阻塞IO模型 · 非阻塞IO模型 · IO复用模型 · 信号驱动IO模型 · 异步IO模型 · BIO编程 · 伪异步IO编程 · NIO编程 · ...