摘要:理解闭包形成的原因,理解定义时和运行时的区别。面试题请写出输出结果的解释,第一个输出这个对象。所以第一行输出,面试题最基础题变体一变体二变体三最基础后运行定时器,此时循环已结束,为。变体依次秒输出一个数字,闭包会使用循环的值。
理解闭包形成的原因,理解定义时和运行时的区别。
面试题1var num = 1; var o = { num: 2, add: function() { this.num = 3; console.log("add", this); (function() { console.log("closure", this); console.log(this.num); this.num = 4; })(); console.log(this.num); }, sub: function() { console.log(this.num); } } o.add(); console.log(o.num); console.log(num); var sub = o.sub; sub(); // 请写出输出结果
zyx456的解释:
01,o.add();
第一个console.log("add", this);//输出o这个对象。
在对象方法中,方法中的this指向这个对象。
第一个this.num = 3;
表示:o.num =3;
02,匿名自执行函数中的this,指向全局环境变量。为window。
所以
(function() { console.log("closure", this);//这里的this是指向哪里?window console.log(this.num);//1 this.num = 4;//window.num = 4; })();
匿名自执行函数的this.num为window.num。为1。
this.num = 4;//window.num = 4;
03,
console.log(o.num);//3,因为前面修改了o.num=3;
04,console.log(num);//4
这里,num为window.num。
05,var sub = o.sub;
sub();//4
zyx456:sub为函数。全局函数中的this指向全局环境,也就是window。
所以为window.num为4;
面试题2function 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的输出分别是什么?
zyx456分析:
var a =fun(0);
首先输出console.log(o);//o未定义,为undefined;
a = { fun:function(m){ return fun(m,0); } } a.fun(1);//返回 fun(1,0);=> console.log(0)=>0 a.fun(2);//返回fun(2,0);=>console.log(0)=>0 a.fun(3)//返回fun(3,0);=>console.log(0)=>0
所以:第一行输出undefined,0,0,0
然后看第二行:var b = fun(0).fun(1).fun(2).fun(3);
fun(0)
首先输出console.log(o);//o未定义,为undefined;
等效于
{ fun:function(m){ return fun(m,0); } }
fun(0).fun(1)
return fun(1,0)
fun(1,0)先输出=>console.log(0)=>0
最后return结果为
{ fun:function(m){ return fun(m,1); } }
fun(0).fun(1).fun(2)
等同于
return fun(2,1)
fun(2,1)->输出console.log(1);=>1
最后return结果为
{ fun:function(m){ return fun(m,2); } }
fun(0).fun(1).fun(2).fun(3)
等同于
return fun(3,2)
fun(2,1)->输出console.log(2);=>2
最后return结果为
{ fun:function(m){ return fun(m,2); } }
所以:第一行输出undefined,0,1,2
最后看第三行:var c = fun(0).fun(1); c.fun(2); c.fun(3);
var c=fun(0).fun(1);
同第二行的b。会输出undefined和0,
c为
{ fun:function(m){ return fun(m,1); } }
c.fun(2)
return fun(2,1)=>输出1。可以看第二行b。
c.fun(3)
return fun(3,1)=>输出1。可以看第二行b。
所以:第一行输出undefined,0,1,1
面试题3// 最基础题 for(var i = 1; i < 10; i ++){ setTimeout(function(){ console.log(i); }, 1000); } // 变体一 for (var i = 1; i < 10; i++) { (function(i){ setTimeout(function(){ console.log(i); }, i * 1000); })(i); } // 变体二 for (var i = 1; i < 10; i++) { (function(){ setTimeout(function(){ console.log(i); }, i * 1000); })(); } // 变体三 for (var i = 1; i < 10; i++) { (function(){ setTimeout(function(i){ console.log(i); }, i * 1000); })(); }
zyx456:
最基础:
1s后运行定时器,此时for循环已结束,i为10。
变体1:
依次1秒输出一个数字,闭包会使用for循环的值。
依次输出1~9
变体2:
依次每隔1秒输出10,10,10.。。。。
变体3:
在匿名自执行函数中,i未定义。所以输出9个undefined。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/106027.html
摘要:当执行时,对象也有一个闭包,引用了函数及外层函数变量,执行输出结果为能看懂前面的代码执行解释,理解上面的代码执行输出就不会有问题了 问题 代码A function fun(n,o){ console.log(o); return { fun:function(m){//[2] return fun(m,n);//[1] ...
摘要:前言最近参加了几场面试,积累了一些高频面试题,我把面试题分为两类,一种是基础试题主要考察前端技基础是否扎实,是否能够将前端知识体系串联。 前言 最近参加了几场面试,积累了一些高频面试题,我把面试题分为两类,一种是基础试题: 主要考察前端技基础是否扎实,是否能够将前端知识体系串联。一种是开放式问题: 考察业务积累,是否有自己的思考,思考问题的方式,这类问题没有标准答案。 基础题 题目的答...
摘要:关于点击进入项目是我于开始的一个项目,每个工作日发布一道面试题。的状态由决定,分成以下两种情况只有的状态都变成,的状态才会变成,此时的返回值组成一个数组,传递给的回调函数。 关于【Step-By-Step】 Step-By-Step (点击进入项目) 是我于 2019-05-20 开始的一个项目,每个工作日发布一道面试题。每个周末我会仔细阅读大家的答案,整理最一份较优答案出来,因本人...
摘要:然后最外层这个函数会返回一个新对象,对象里面有一个属性,名为,而这个属性的值是一个匿名函数,它会返回。 最近看到一条有意思的闭包面试题,但是看到原文的解析,我自己觉得有点迷糊,所以自己重新做一下这条题目。 闭包面试题原题 function fun(n, o) { // ① console.log(o); return { // ② fun: function(m) ...
阅读 1342·2021-09-24 10:26
阅读 3655·2021-09-06 15:02
阅读 603·2019-08-30 14:18
阅读 575·2019-08-30 12:44
阅读 3118·2019-08-30 10:48
阅读 1936·2019-08-29 13:09
阅读 1992·2019-08-29 11:30
阅读 2278·2019-08-26 13:36