js闭包面试题

js闭包面试题一个闭包面试题 functionfun n o console log o return fun function m returnfun m n vara fun 0 a fun 1 a fun 2 a fun 3 varb fun 0 fun 1 fun 2 fun 3 varc fun 0 fun 1 c fun

一个闭包面试题

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); var b = fun(0).fun(1).fun(2).fun(3); var c = fun(0).fun(1);c.fun(2);c.fun(3); //问:三行a,b,c的输出分别是什么? 

觉得有点意思,和大家一起来聊聊。

我相信如果你不是非常理解JavaScript中的闭包,一定是不想看这段代码的。

好的,我们暂时先不去想这段代码,先看点简单的

function fun0(){ 
    var a=1; console.log(a); } function fun1(){ 
    console.log(a); } fun0(); //1 fun1(); //报错 a is not defined 

这段代码,我相信大家应该知道最后为什么结果会是 1 和 报错 的,在函数内声明的变量只在函数体内定义,它们是局部变量,作用域是局部的,所以 函数 fun1 调用后,找不到a,就报错了,JavaScript采用词法作用域,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,所以我们只要改改上面函数 fun1的位置,它就不会报错了。

function fun0(){ 
    var a=1; console.log(a); //把fun1放在fun0中,就不报错了 function fun1(){ 
    console.log(a); } fun1(); //1 } fun0(); //1 
function fun(n,o){ 
    return { 
    } } 
function fun(n,o){ 
    console.log(o); return { 
    fun:function(m){ 
    return fun(m,n); } }; } var a = fun(0); 
{ 
    fun:function(m){ 
    return fun(m,0); } } 

var a=fun(0),传入一个参数0,那就是说,函数fun中参数 n 的值是0了,而返回的那个对象中,需要一个参数n,而这个对象的作用域中没有n,它就继续沿着作用域向上一级的作用域中寻找n,最后在函数fun中找到了n,n的值是0,这段话是本文的重点, 明白这段,那问题就容易解决了。

说到这里,这道题基本上可以解决了,希望大家能听明白我上面说的话,下面的就简单了。我们一步一步看。

现在我们知道 a 是

{ 
    fun:function(m){ 
    return fun(m,0); } } 
{ 
    fun:function(1){ 
    return fun(1,0); } } 

a.fun(1); 返回的结果,就是 fun(1,0),返回的结果

 function fun(n,o){ 
    //n的值为1,o的值为0 console.log(o); return { 
    fun:function(m){ 
    return fun(m,n);//n的值为1 } }; } fun(1,0); //输出0,并返回一个对象,这个对象有一个fun的方法,这个方法调用后,会返回外层fun函数调用的结果,并且外层函数的第二个参数是 n 的值,也就是1  

a.fun(2); 会怎么样?看代码

{ 
    fun:function(2){ 
    return fun(2,0); } } 

a.fun(2); 返回的结果,就是 fun(2,0),返回的结果

function fun(n,o){ 
    //n的值为2,o的值为0 console.log(o); return { 
    fun:function(m){ 
    return fun(m,n); //n的值为2 } }; } fun(2,0); //输出0,并返回一个对象,这个对象有一个fun的方法,这个方法调用后,会返回外层fun函数调用的结果,并且外层函数的第二个参数是 n 的值,也就是2  

a.fun(3); 就不说了,一样的。

var a = fun(0); a.fun(1); a.fun(2); a.fun(3); var b = fun(0).fun(1).fun(2).fun(3); 

说下结果

var a = fun(0); a.fun(1); a.fun(2); a.fun(3); //undefined 0 0 0  var b = fun(0).fun(1).fun(2).fun(3); //undefined 0 1 2 var c = fun(0).fun(1); c.fun(2); c.fun(3); //undefined 0 1 1 

转载来自http://www.cnblogs.com/xxcanghai/p/4991870.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177346.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午7:44
下一篇 2026年3月26日 下午7:44


相关推荐

  • 2022考研数学二考试大纲最新_数学二线性代数考研大纲

    2022考研数学二考试大纲最新_数学二线性代数考研大纲2022年数学二考试大纲考试形式和试卷结构一、试卷满分及考试时间二、答题方式三、试卷内容结构四、试卷题型结构高等数学一、函数、极限、连续二、一元函数微分学三、一元函数积分学四、多元函数微积分学五、常微分方程线性代数一、行列式二、矩阵三、向量四、线性方程组五、矩阵的特征值及特征向量六、二次型考试科目:高等数学、线性代数考试形式和试卷结构一、试卷满分及考试时间试卷满分为150分,考试时间为180分钟.二、答题方式答题方式为闭卷、笔试.三、试卷内容结构高等教学 约80%线性代数 约20%四、试

    2022年8月11日
    44
  • PHP入门:在Windows中安装PHP工作环境

    PHP入门:在Windows系统中分别安装PHP工作环境一、什么是LAMP?Linux+Apache+Mysql+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各

    2021年12月20日
    50
  • 苹果Mac允许安装未知来源的应用「建议收藏」

    苹果Mac允许安装未知来源的应用「建议收藏」打开终端,输入命令密码是你的开机密码允许安装未知来源的应用允许sudospctl–master-disable不允许sudospctl–master-enable

    2025年8月19日
    5
  • [RK3288][Android6.0] DVP接口摄像头OV5640添加

    [RK3288][Android6.0] DVP接口摄像头OV5640添加Platform:RK3288OS:Android6.0Kernel:3.10.92DVP或者MIPI接口直接在cameraboard文件中改动就可以。cam_board_rk3288.xml:<?xmlversion=”1.0″?><BoardFile> <BoardXmlVersionversion=”v0.0xf.0″>…

    2022年6月9日
    78
  • python中if __name__ == ‘__main__’是什么意思

    python中if __name__ == ‘__main__’是什么意思执行当前文件中: __name__=='__main__'是返回true,引用模块中的则返回false如:现在有两python文件,one.py和two.py

    2022年7月5日
    23
  • python浪漫表白源码(附带详细教程)_怎么做表白代码

    python浪漫表白源码(附带详细教程)_怎么做表白代码遇到喜欢的某某某,又想给她一点点新鲜感,可以用上博主的这个鲜花表白代码,本代码用于谈恋爱的任意阶段。先来看看效果图本代码简单易懂,适合Python基础小白使用,用到turtle海龟绘图和简单的输出语句。如遇到不懂得地方和需要其它的浪漫表白代码请联系本人QQ:483062431附上源代码:#绘制玫瑰花并添加文字importturtle#设置画布大小#turtle.screensize(canvwidth=None,canvheight=None,bg=None)turtle.setu

    2025年11月28日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号