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就要返回一个函数,这里可以这么写:

function sum(num1,num2)
{
if(num2 == undefined){
return function(num){
return num1 + num;
}
}else{
return num1 + num2;
}
} console.log(sum(2,3)); //5
console.log(sum(2)(3)); //5 还有一道比较有意思的问题是说once这个只执行一次的函数,题目要求传入一个函数对它进行包装,要求返回的结果不管执行几次只会返回第一次的结果。例如: g = once(func);
g(2); //func(2)的结果
g(3); //还是func(2)的结果 思路:这道题不用说肯定需要一个全局变量来判断函数时候执行过,需要一个数据来存放第一次执行的结果,根据前一个变量来判断是否执行过,如果没有执行后返回结果,如果执行过则不需要再次执行,直接返回第一次的结果。这题一个考察点是全局变量的控制,还有一个考察点就是怎么利用这个传入的func来得到结果。话不多说,直接上代码:
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;
}
}
} g = once(fn);
console.log(g(2)); //4
console.log(g(3)); //4 这里注意运用apply传入arguments来调用func,arguments是一个function特有的属性,表示的是传入的所有参数,是一个类数组但不是真正意义上的数组,如果想将它转换成数组可以使用: Array.prototype.slice.call(arguments); 这里还要说一下关于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. VMware workstation虚拟集群实践(1)—— 配置集群多节点互信

    一. 简述 节点互信,是集群管理的基本操作之一.节点互信是通过SSH协议的公钥密钥认证来代替密码认证来实现的.对于单点批量管理多个节点,多个节点之间相互通信来说,配置SSH单方向信任,或者互信十分必要 ...

  2. sort排序错乱问题

    对于sort排序  之前就遇到过这种问题  不过没有在意 今天遇到 就找了一下原理 在这种sort排序中可以看到排序几乎没有什么问题 就是5比较特殊 会在20是的后面 ~ sort()方法开始的时候会 ...

  3. NYOJ--86--set.find()--找球号(一)

    /* Name: NYOJ--86--找球号(一) Date: 20/04/17 14:45 Description: 理想很美好,现实很残酷,准备用字符串水过,结果TLE了 ╮(╯▽╰)╭ */ # ...

  4. 发布内网网站服务器让公网可以访问,无需NAT

    有些时候,我们的测试网站搭建在我们的测试环境中,网站正式上线前,需要先测试下我们的测试网站是否正常,就可以用下面的方式将其内网网站服务器放至公网上,用器提供的外网地址就可以直接访问我们的内网网站服务器 ...

  5. 关于dfs+剪枝第一篇:hdu1010

    最近进入了dfs关于剪枝方面的学习,遇到的第一道题就是hdu的1010.一道很基础的剪枝..可我不幸地wa了很多次(待会再解释wa的原因吧QAQ),首先我们来看一下题目. Problem Descri ...

  6. 排座椅 2008 NOIP 普及组 第二题

    题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳.同学 ...

  7. Dbentry4.2连接MSSQL

    Dbentry4.2 连接MSSQL <Leafing.Settings> <add key="DefaultContext" value="mssql ...

  8. c和fortran混编(基于GNU/Linux,转自 linzch)

    网 上说要分c为主程序和fortran为主程序两种情况讨论,其实我觉得不用,只要你了解生成可执行文件的机制.这个机制就是:不论是单一语言模块之间的 链接还是不同语言之间的混合链接,本质目的都是要链接器 ...

  9. Charles使用(一)

    Charles使用(一)   1.什么是Charles Charles是在MAC下常用的网络封包截取工具,在做移动开发时,是为了调试与服务端的网络通信协议,常常需要截取网络包来分析.Charles是通 ...

  10. C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能

    1.IEnumerator和IEnumerable的作用 其实IEnumerator和IEnumerable的作用很简单,就是让除数组和集合之外的类型也能支持foreach循环,至于foreach循环 ...