摘要:理解閉包形成的原因,理解定義時(shí)和運(yùn)行時(shí)的區(qū)別。面試題請(qǐng)寫(xiě)出輸出結(jié)果的解釋?zhuān)谝粋€(gè)輸出這個(gè)對(duì)象。所以第一行輸出,面試題最基礎(chǔ)題變體一變體二變體三最基礎(chǔ)后運(yùn)行定時(shí)器,此時(shí)循環(huán)已結(jié)束,為。變體依次秒輸出一個(gè)數(shù)字,閉包會(huì)使用循環(huán)的值。
理解閉包形成的原因,理解定義時(shí)和運(yùn)行時(shí)的區(qū)別。
面試題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(); // 請(qǐng)寫(xiě)出輸出結(jié)果
zyx456的解釋?zhuān)?/p>
01,o.add();
第一個(gè)console.log("add", this);//輸出o這個(gè)對(duì)象。
在對(duì)象方法中,方法中的this指向這個(gè)對(duì)象。
第一個(gè)this.num = 3;
表示:o.num =3;
02,匿名自執(zhí)行函數(shù)中的this,指向全局環(huán)境變量。為window。
所以
(function() { ? console.log("closure", this);//這里的this是指向哪里?window ? console.log(this.num);//1 ? this.num = 4;//window.num = 4; })();
匿名自執(zhí)行函數(shù)的this.num為window.num。為1。
this.num = 4;//window.num = 4;
03,
console.log(o.num);//3,因?yàn)榍懊嫘薷牧薿.num=3;
04,console.log(num);//4
這里,num為window.num。
05,var sub = o.sub;
sub();//4
zyx456:sub為函數(shù)。全局函數(shù)中的this指向全局環(huán)境,也就是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,?,?,? //問(wèn):三行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結(jié)果為
{ 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結(jié)果為
{ 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結(jié)果為
{ 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。會(huì)輸出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// 最基礎(chǔ)題 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:
最基礎(chǔ):
1s后運(yùn)行定時(shí)器,此時(shí)for循環(huán)已結(jié)束,i為10。
變體1:
依次1秒輸出一個(gè)數(shù)字,閉包會(huì)使用for循環(huán)的值。
依次輸出1~9
變體2:
依次每隔1秒輸出10,10,10.。。。。
變體3:
在匿名自執(zhí)行函數(shù)中,i未定義。所以輸出9個(gè)undefined。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/106027.html
摘要:當(dāng)執(zhí)行時(shí),對(duì)象也有一個(gè)閉包,引用了函數(shù)及外層函數(shù)變量,執(zhí)行輸出結(jié)果為能看懂前面的代碼執(zhí)行解釋?zhuān)斫馍厦娴拇a執(zhí)行輸出就不會(huì)有問(wèn)題了 問(wèn)題 代碼A function fun(n,o){ console.log(o); return { fun:function(m){//[2] return fun(m,n);//[1] ...
摘要:前言最近參加了幾場(chǎng)面試,積累了一些高頻面試題,我把面試題分為兩類(lèi),一種是基礎(chǔ)試題主要考察前端技基礎(chǔ)是否扎實(shí),是否能夠?qū)⑶岸酥R(shí)體系串聯(lián)。 前言 最近參加了幾場(chǎng)面試,積累了一些高頻面試題,我把面試題分為兩類(lèi),一種是基礎(chǔ)試題: 主要考察前端技基礎(chǔ)是否扎實(shí),是否能夠?qū)⑶岸酥R(shí)體系串聯(lián)。一種是開(kāi)放式問(wèn)題: 考察業(yè)務(wù)積累,是否有自己的思考,思考問(wèn)題的方式,這類(lèi)問(wèn)題沒(méi)有標(biāo)準(zhǔn)答案。 基礎(chǔ)題 題目的答...
摘要:關(guān)于點(diǎn)擊進(jìn)入項(xiàng)目是我于開(kāi)始的一個(gè)項(xiàng)目,每個(gè)工作日發(fā)布一道面試題。的狀態(tài)由決定,分成以下兩種情況只有的狀態(tài)都變成,的狀態(tài)才會(huì)變成,此時(shí)的返回值組成一個(gè)數(shù)組,傳遞給的回調(diào)函數(shù)。 關(guān)于【Step-By-Step】 Step-By-Step (點(diǎn)擊進(jìn)入項(xiàng)目) 是我于 2019-05-20 開(kāi)始的一個(gè)項(xiàng)目,每個(gè)工作日發(fā)布一道面試題。每個(gè)周末我會(huì)仔細(xì)閱讀大家的答案,整理最一份較優(yōu)答案出來(lái),因本人...
摘要:然后最外層這個(gè)函數(shù)會(huì)返回一個(gè)新對(duì)象,對(duì)象里面有一個(gè)屬性,名為,而這個(gè)屬性的值是一個(gè)匿名函數(shù),它會(huì)返回。 最近看到一條有意思的閉包面試題,但是看到原文的解析,我自己覺(jué)得有點(diǎn)迷糊,所以自己重新做一下這條題目。 閉包面試題原題 function fun(n, o) { // ① console.log(o); return { // ② fun: function(m) ...
閱讀 1360·2021-09-24 10:26
閱讀 3674·2021-09-06 15:02
閱讀 629·2019-08-30 14:18
閱讀 586·2019-08-30 12:44
閱讀 3127·2019-08-30 10:48
閱讀 1950·2019-08-29 13:09
閱讀 2003·2019-08-29 11:30
閱讀 2288·2019-08-26 13:36