作者|来源|达达前端小酒馆1面试题是什么?你能让我谈谈吗?请看下面的代码:functionfun(a,b){console.log(b)return{fun:function(c){returnfun(c,a);}};}vard=fun(0);d.乐趣(1);d.乐趣(2);d.乐趣(3);变种d1=乐趣(0)。乐趣(1)。乐趣(2)。乐趣(3);变量d2=乐趣(0)。fun(1);d2.fun(2);d2.fun(3);functionfun(a,b){console.log(b)return{fun:function(c){returnfun(c,a);}}};}vard=fun(0);d.乐趣(1);d.fun(2);d.fun(3);vard1=fun(0).fun(1).fun(2).fun(3);vard2=fun(0).fun(1);d2.fun(2);d2.fun(3);undefinedVM1036:20VM1036:20VM1036:20VM1036:2undefinedVM1036:20VM1036:21VM1036:22VM1036:2undefinedVM1036:20VM1036:21VM1036:21{fun:?}//answer://undefined,0,0,0//undefined,0,1,2//undefined,0,1,1JS函数有命名函数(namedfunctions)和匿名函数两种功能。如何判断两个函数的方法?可以通过fn.name来判断,有名字就是命名函数,没有名字就是匿名函数。需要注意的是,在IE浏览器上无法获取named函数的名称,会返回undefined的结果,但在GoogleChrome浏览器上是可以获取到的。//获取名字functiongetFunctionName(fun){if(fun.name!==undefined)returnfun.name;varfunName=fun.toString();funName=funName.substr('函数'.length);funName=funName.substr(0,funName.indexOf('('));returnfunName;}2创建函数的方法有哪些?第一种是:声明函数,声明函数方法,包括函数名和函数体。functionfunDa(){}第二种是:createanexpressionofananonymousfunction创建一个变量,内容是一个函数,就是一个匿名函数varfunDa=function(){}这样这个函数就没有namevarfunDa=function(){}getFunctionName(funDa).length;//0第三种方法是:创建命名函数表达式varfunDa=functiondada(){};创建一个变量,赋给变量的内容是一个函数带名字的命名函数表达式公式的函数名只能在创建函数内部使用,函数外层只能使用funData,dada函数名只能在创建函数内部使用定义函数inanobject也是一个函数表达式,第四种是:FunctionConstructorFunction("alert(1)");?anonymous(){alert(1)}Function("dada");?anonymous(){dada}newFunction("alert(1)");?anonymous(){alert(1)}newFunction("dada");?anonymous(){dada}函数构造函数传递函数字符串并返回包含字符串命令的函数。第五种是:自执行函数(function(){alert(1);})();undefined(function(){alert(1);})?(){alert(1);}(functionda1(){警报(1);})();自执行函数也是“函数表达式”。第六种是:其他方法如使用eval、setTimeout、setInterval等。3第一个fun函数是一个标准的命名函数声明,是一个新创建的函数,返回一个对象字面量表达式,属性是一个新的Object。这样返回,对象包含一个属性fun,属于匿名函数表达式。这个有趣的属性存储了一个新创建的匿名函数表达式,所有声明的匿名函数都是新函数。那么第一个fun函数和第二个fun函数不同,都是新创建的函数。4函数作用域链的问题对象函数表达式里面:vard={fn:function(){console.log(fn);}};d.fn();VM1879:3UncaughtReferenceError:fnisnotdefinedatObject.fn(:3:21)at:6:3fn@VM1879:3(anonymous)@VM1879:6vard1={fn:function(){console.log("dada");}};d1.fn();VM1973:3dadaundefinedfunctionexpressioninsideanon-object:varda=function(){console.log(da);};da();VM2270:2?(){console.log(da);}undefined使用var访问存储当前函数的变量,varda,da()访问函数的变量,在对象内部无法访问。5函数作用域链:functionfun(a,b){console.log(b)return{fun:function(c){returnfun(c,a);}};}vard=fun(0);d.乐趣(1);d.fun(2);d.fun(3);vard1=fun(0).fun(1).fun(2).fun(3);vard2=fun(0).fun(1);d2.fun(2);d2.fun(3);vard=fun(0);d.乐趣(1);d.fun(2);d.fun(3);undefinedVM2273:20VM2273:20VM2273:20第一个fun(0)调用第一层的fun函数,第二个fun(1)调用fun函数返回前一个fun的值。即函数fun(1)、fun(2)、fun(3)只调用了二级fun函数。第一次调用fun(0)时,b未定义,第二次调用fun(1)时,c为1,a为0。vard=fun(0);调用第一层d.fun->fun(0).fun调用第二层fun:function(1),返回fun(1,a),fun(1,0),此时fun关闭了a的外部函数,即第一次调用的a=0。这样第一层的fun函数就是fun(1,0),所以是0。第一次:functionfun(0,undefined){console.log(undefined)return{fun:function(c){返回乐趣(c,0);}};}fun(0),b未定义,fun(0).fun(1),c=1,此时fun闭包外层函数的a,即第一个a=0调用,即c=1,a=0,第一层内部调用了fun函数fun(1,0),所以b=0。functionfun(a,b){console.log(b)return{fun:function(1){returnfun(1,0);}};}第三次调用fun(2)时,c为2,或者调用d.fun还是在第一次调用fun(2,0)时关闭了a,所以输出b为0。functionfun(a,b){console.log(b)return{fun:function(c){returnfun(c,a);}};}vard=fun(0);d.乐趣(1);d.乐趣(2);d.fun(3);6vard1=fun(0).fun(1).fun(2).fun(3);从fun(0)调用第一层fun函数,返回值为对象,第二层fun(1)调用第二层fun函数,下面也是第二层fun函数。第一层fun(0),b未定义,第二层.fun(1)c为1,c=1,a=0,内部调用第一层fun函数fun(1,0),所以b为0.调用your.fun(2)时,c为2,此时当前fun函数不是第一次执行的返回对象,而是第二次执行的返回对象。一级fun函数的第二次执行是:fun(1,0),a=1,b=0。第三次执行fun函数,c=2,a=1functionfun(a,b){console.log(b)return{fun:function(1){returnfun(1,0);}};}乐趣(1,0),a=1,b=0。第三次执行fun函数,c=2,a=1functionfun(a,b){console.log(b)return{fun:function(2){returnfun(2,1);}};}//1functionfun(2,1)a=2,b=1第四次调用。fun(3)iscis3//a=2functionfun(a,b){console.log(b)return{fun:function(3){returnfun(3,2);}};}7vard2=fun(0).fun(1);d2.fun(2);d2.fun(3);vard2=fun(0).fun(1);//undefined,0return(c=1,a=0)此时返回fun(1,0),所以b为0d2.fun(2);第三次调用.fun(2),cis2//cis2,a=1,b=0functionfun(a,b){console.log(b)return{fun:function(2){returnfun(2,一);}};}所以returnfun(2,1)functionfun(a=2,b=1),所以是1d2.fun(3),c是3,还是第二次调用的返回值,最后调用第一层fun(a,b)//c为3,a=1,b=0functionfun(a,b){console.log(b)return{fun:function(3){returnfun(3,a);}};}所以returnfun(3,1)functionfun(a=3,b=1),所以是1这里注意://cis3,a=1,b=0这是调用这段代码的结果a=1,b=0vard2=fun(0).fun(1);好吧,那你就知道大概的答案和解释了:8总的来说,你懂的!辛苦了,给个赞吧!求打赏,我来了functionfun(a,b){console.log(b)return{fun:function(c){returnfun(c,a);}};}vard=fun(0);d.乐趣(1);d.fun(2);d.fun(3);vard1=fun(0).fun(1).fun(2).fun(3);vard2=fun(0).fun(1);d2.fun(2);d2.fun(3);undefinedVM1036:20VM1036:20VM1036:20VM1036:2undefinedVM1036:20VM1036:21VM1036:22VM1036:2undefinedVM1036:20VM1036:21VM1036:21{:?}热爱编程技术,专注前端的程序员,呈现web前端领域、数据结构与算法、网络原理等课程,热点新闻。推荐阅读1、你对这个、new、bind、call、apply了解多少?那我告诉你2.为什么要学JavaScript设计模式,因为它是核心3.一篇文章带你走进JavaScript中的闭包和高级函数4.大厂HR面试ES6面试题的知识点??Don't忘记留下你学习的足迹【点赞+收藏+评论】AuthorInfo:【作者】:Jeskson【原创公众号】:达达前端酒馆。【福利】:公众号回复“信息”,送自学资料大礼包(进群分享,想要什么就说,看我有没有)!【转载说明】:转载请注明出处,谢谢合作!~大前端开发,定位前端开发技术栈博客,PHP背景知识点,web全栈技术领域,数据结构与算法,网络原理等以通俗易懂的方式呈现给小伙伴方式。感谢您的支持,感谢您的厚爱!!!如本账号内容有问题(例如:涉及版权或其他问题),请及时联系我们进行整改,我们会尽快处理。请喜欢它!因为您的认可/鼓励是我写作最大的动力!欢迎来到达达的CSDN!这是一个有品质有态度的博客