起名
男孩起名 女孩起名 公司起名 店铺起名 牛年起名 虎年起名 生辰八字起名 英文起名 诗词起名
励志
励志文章 励志故事 励志文案 励志电影 励志名言 励志句子 励志歌曲 励志签名 励志格言 高考励志 励志诗句 励志网名 励志书籍 励志演讲稿 励志小说 励志座右铭 励志人物 励志对联 励志说说 励志作文
句子
伤感的句子 唯美的句子 爱情的句子 优美句子 正能量句子 经典句子 表白的句子 哲理句子 友情的句子 好词好句好段 美好的句子 朋友圈说说的好句子 搞笑的句子 想你的句子
个性签名
微信个性签名 QQ个性签名 伤感个性签名 霸气的个性签名 情侣个性签名 男生个性签名 女生个性签名 英文个性签名 超拽个性签名 非主流个性签名 搞笑个性签名 火星文个性签名 唯美个性签名
十二星座
白羊座 金牛座 双子座 巨蟹座 狮子座 处女座 天秤座 天蝎座 射手座 摩羯座 水瓶座 双鱼座 星座知识
十二生肖
属鼠 属牛 属虎 属兔 属龙 属蛇 属马 属羊 属猴 属鸡 属狗 属猪 生肖基础知识
祝福语大全
生日祝福语 结婚祝福语 订婚祝福语 新年祝福语 情人节祝福语 母亲节祝福语 父亲节祝福语 建党节祝福语 七夕节祝福语 教师节祝福语 国庆节祝福语 中秋节祝福语 爱情祝福语 毕业祝福语 开业祝福语 升学祝福语 高考祝福语 中考祝福语 考试祝福语 搬新家祝福语
说说大全
个性说说 伤感说说 搞笑说说 心情说说 爱情说说 经典说说 qq说说 朋友圈说说 情感说说 晚安说说 下雨说说 霸气说说 七夕说说
范文大全
入党申请书 入团申请书 自我鉴定 工作总结 工作计划 个人简历 辞职报告 检讨书 演讲稿 心得体会 实习报告 转正申请书 导游词 述职报告 策划书 加油稿 慰问信 感谢信 介绍信 邀请函

经典JS闭包面试题(js闭包的理解面试)

更新时间:2022-02-28 来源:互联网 点击:

  都答对了么?如果都答对了恭喜你在js闭包问题当中几乎没什么可以难住你了;如果没有答案,继续往下分析。

  AD:经典JS闭包面试题(js闭包的理解面试)

  由工作中演变而来的面试题

  这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧。

  先看题目代码:

  function fun(n,o) {

  console.log(o)

  return {

  fun:function(m){

  return fun(m,n);

  }

  };

  }

  var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined,?,?,?

  var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?

  var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,?,?,?

  //问:三行a,b,c的输出分别是什么?

  这是一道非常典型的JS闭包问题。其中嵌套了三层fun函数,搞清楚每层fun的函数是那个fun函数尤为重要。

  可以先在纸上或其他地方写下你认为的结果,然后展开看看正确答案是什么?

  答案

  都答对了么?如果都答对了恭喜你在js闭包问题当中几乎没什么可以难住你了;如果没有答案,继续往下分析。

  JS中有几种函数

  首先,在此之前需要了解的是,在javascript中函数可以分为两种,具名函数(命名函数)和匿名函数。

  区分这两种函数的方法非常简单,可以通过输出 fn.name 来判断,有name的就是具名函数,没有name的就是匿名函数

  注意:在低版本IE上无法获取具名函数的name,会返回undefined,建议在火狐或是谷歌浏览器上测试

  或是采用兼容IE的获取函数name方法来获取函数名称:

  /**

  * 获取指定函数的函数名称(用于兼容IE)

  * @param {Function} fun 任意函数

  */

  function getFunctionName(fun) {

  if (fun.name !== undefined)

  return fun.name;

  var ret = fun.toString();

  ret = ret.substr('function '.length);

  ret = ret.substr(0, ret.indexOf('('));

  return ret;

  }

  遂用上述函数测试是否为匿名函数:

  image

  可以得知变量fn1是具名函数,fn2是匿名函数

  创建函数的几种方式

  说完函数的类型,还需要了解javascript中创建函数都有几种创建方法。

  1、声明函数

  最普通最标准的声明函数方法,包括函数名及函数体。

  function fn1(){}

  2、创建匿名函数表达式

  创建一个变量,这个变量的内容为一个函数

  var fn1=function (){}

  注意:采用这种方法创建的函数为匿名函数,即没有函数name

  var fn1=function (){};

  getFunctionName(fn1).length;//0

  3、创建具名函数表达式

  创建一个变量,内容为一个带有名称的函数

  var fn1=function xxcanghai(){};

  注意:具名函数表达式的函数名只能在创建函数内部使用

  即采用此种方法创建的函数在函数外层只能使用fn1不能使用xxcanghai的函数名。xxcanghai的命名只能在创建的函数内部使用

  测试:

  var fn1=function xxcanghai(){

  console.log("in:fn1<",typeof fn1,">xxcanghai:<",typeof

  xxcanghai,">"); }; console.log("out:fn1<",typeof

  fn1,">xxcanghai:<",typeof xxcanghai,">");

  fn1();

  //out:fn1< function >xxcanghai:< undefined >

  //in:fn1< function >xxcanghai:< function >

  可以看到在函数外部(out)无法使用xxcanghai的函数名,为undefined。

  注意:在对象内定义函数如var o={ fn : function (){…} },也属于函数表达式

  4、Function构造函数

  可以给 Function 构造函数传一个函数字符串,返回包含这个字符串命令的函数,此种方法创建的是匿名函数。

  image

  5、自执行函数

  (function(){alert(1);})();

  (function fn1(){alert(1);})();

  自执行函数属于上述的“函数表达式”,规则相同

  6、其他创建函数的方法

  当然还有其他创建函数或执行函数的方法,这里不再多说,比如采用 eval , setTimeout , setInterval 等非常用方法,这里不做过多介绍,属于非标准方法,这里不做过多展开

上一篇:小学生错别字研究报告精选5篇 下一篇:黑白免费个人简历封面(黑白简历封面图片素材)
生活常识推荐
  • 雅漾防晒霜怎么样 防晒霜的正确使
  • 一帆风顺的养殖方法(一帆风顺的养殖
  • 漂浮的反义词是什么(漂浮的反义词是
  • 百度网盘如何删除文件,删除后又如何
  • 2017国家燃油补贴政策标准条件(2019燃油补贴发放标准政策)
  • 2017重大安全生产事故汇总(历年安全生产事故统计)
  • 中国十大乐队排名(中国最有名的乐队)
  • 安全生产八大高危行业是什么(安全八大高危行业有哪些)
  • 萨德事件是什么意思_对中国韩国产生哪些影响(萨德事件对中韩关系的影响)
  • 全国10大连锁超市品牌排行榜(中国十大连锁超市排名)
  • 猜你喜欢的生活常识