经典JS闭包面试题
admin
2024-01-27 09:04:36
0

  都答对了么?如果都答对了恭喜你在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 等非常用方法,这里不做过多介绍,属于非标准方法,这里不做过多展开

相关内容

热门资讯

青春励志校园广播稿200字 青春励志校园广播稿200字年轻,没有失败青春不复返明日可再来坚实的足迹踏出是一片片美丽的云彩思绪飞扬...
大学校园青春励志歌曲   在大学校园里青春励志的歌曲有哪些呢?下面是小编为大家整理的大学校园青春励志歌曲,欢迎阅读。  大...
重返20岁插曲   给我一个吻是重返20岁电影插曲,由杨子珊演唱,以下是励志网带来的重返20岁插曲,希望大家喜欢。
夏至未至小说在线阅读_免费阅...   夏至未至小说自2006年由春风文艺出版社出版后,连续五年长期位列全国虚构类畅销书排行榜前茅。后修...
女人的保养励志句子 女人的保养励志句子(精选245句)  在日常学习、工作和生活中,大家都收藏过自己喜欢的句子吧,从表达...
成功是成功之母励志文章 成功是成功之母励志文章  只有成功了才可能赢得下一次更大的成功。  他大学毕业后,被分到电视台工作。...
有关拳击励志类的电影   第一部:今天的主角——  《斗士》FIGHTING(2010年)  导演:大卫·O·拉塞尔  主...
成功女人经典励志语录 成功女人经典励志语录(精选165句)  在我们平凡的日常里,大家总免不了要接触或使用语录吧,语录是指...
2015青春励志演讲稿:李宏...   所以第一年学习是很困难的,但是我又有生存的压力,我想及早地去挣钱。有一次我看到我们系以外有一位教...
简短励志美文欣赏 简短励志美文欣赏(通用18篇)  我们在生活中遭遇了一些烦恼困境的时候,总是会来翻找一些励志短文查看...
励志电影《我要上学》推荐   电影《我要上学》反映的是一个来源于余干县真实生活的故事,讲述了山村小学女生赵小莲遭遇因山洪暴发父...
校园励志电影100部   励志电影,也会是你失落无助时的力量,永远不要放弃斗志,一点一点爆发你自己。下面给大家分享校园励志...
美国篮球励志电影   十部篮球励志电影推荐:在如今这个体育运动风行的年代,篮球运动的推广更是推向全国,由于受美国NBA...
励志座右铭简短   励志座右铭简短(一)  1、是金子总会发光。  2、宝剑锋从磨砺出,梅花香苦自苦寒来。  3、人...
励志情感类优美小短文 励志情感类优美小短文(通用26篇)  因为生命中有了情感,我们的人生才能如此美好。以下是小编为大家收...
励志电影《国王的演讲》精彩影...   《国王的演讲》精彩影评(一)  一个偶然的机会,从学校的图书馆海报上看到了有关《国王的演讲》的宣...
励志英文电影台词   励志英文电影台词  1、 You can't change the past.  过去的事是不可...
十大打工励志歌曲   背井离乡,远赴城市发展,为求谋生,饱受工作劳苦。在现实生活中,外出打工成为一种独特的生活方式,打...
适合妈妈看的书籍推荐   母亲节是一个应该高兴的日子,并不需要煽情到让大家哭一通。母亲能更好地理解孩子,也能被孩子更好地理...
励志电影《美丽心灵》剧情简介   美丽心灵(A Beautiful Mind)是一部关于一个真实天才的极富人性的剧情片。影片讲述一...