经典JS闭包面试题

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

  AD:

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

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

  先看题目代码:

  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 等非常用方法,这里不做过多介绍,属于非标准方法,这里不做过多展开

相关文章

面试题:讲述大学中你最有成就感的一件事情

在日常学习和工作中,只要有考核要求,就会有试题,借助试题可以更好地对被考核者的知识才能进行考察测验。什么类型的试题才能有效帮助到我们呢?下面是小编为大家收集的面试题:讲述大学中你最有成就感的一件事情,...
面试题2014-08-03
面试题:讲述大学中你最有成就感的一件事情

小升初面试题

很多家长为孩子”小升初“面试问题而焦虑不安,因为大家都不清楚考官将会问什么样的问题,问题会以什么样的形式出现。不用担心,一點通来帮助你和孩子一起面对“小升初“。其实,很多城市很多学校早已实行”小升初“...
面试题2012-04-01
小升初面试题

设计模式 面试题

近几年来,设计模式试题已广泛出现在一些IT企业(包括一些巨牛型企业)的面试和笔试题中,从本文开始我将通过几篇文章来介绍一下一些已出现过的设计模式面试和笔试题,欢迎大家讨论。某房地产公司欲开发一套房产信...
面试题2015-01-02
设计模式 面试题

竞争上岗面试题 -

  第一套第一题:一些企业因某些非主观因素,造成漏税或逾期申报等现象,而受到处罚,竞争上岗面试题。作为地税部门如何改进服务,帮助企业,有效减少违章处罚行为发生率。  出题思路:考量考生公共服务意识和综...
面试题2019-03-09
竞争上岗面试题 -

c语言面试题及答案

导读:C语言是一门通用计算机编程语言,应用广泛。在面试的时候刷一遍题库,能够帮助你加深各方面的知识点,使自己面试成功的几率更大。下面小编为大家带来c语言面试题及答案,希望能帮助到大家。 一、选择题(1...
面试题2012-03-05
c语言面试题及答案

计算机基础知识面试题

下面是小编整理的计算机基础知识面试,欢迎阅读。1.网络结构在OSI参考模型中,物理层的作用是透明的传输比特流。对等实体在一次交互作用中传送的信息单位称为协议数据单元,它包括控制信息和用户数据两部分。上...
面试题2019-05-01
计算机基础知识面试题