碰上了個閉包的面試題

2021-08-17 10:21:03 字數 1542 閱讀 2830

2018-03-22

今天面試有個筆試題是這樣的,咋一看返回乙個方法又呼叫自己,瞬間感覺有點暈乎乎的,看了一會也沒心情做了,然後就寫了乙個 undefind ,回來查了一下才發現並不難,只是認真一點一步步分析也就分出來了

function fun(n,o)

} }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)

當 執行fun(0);   這個時候列印 o ,肯定是沒有的,也就是 undefind

但是此時返回 了乙個方法給 a ,方法裡 return 回來的 n 其實已經通過傳進來賦值儲存起來,也就是以下的下面

var a = 

}

那麼再執行 a.fun(1) 的時候,得到的就是列印了 0 ;  a.fun(2) 和 a.fun(3) 也是同樣的結果;

所以 var a 部分 得出的是:undefind , 0, 0, 0

這個可以拆分成:

var b = fun(0);  

var b1 = b.fun(1);

var b2 = b1.fun(2);

var b3 = b2.fun(3);

b 先執行  fun(0) 和上面 a 一樣,undefind,然後返回乙個物件方法

var b = 

}

那麼我執行 b.fun(1) 的時候,這個時候 n = 0 ,所以會列印出 o為 0,這個時候再返回了乙個方法給 b1,這個方法中的 n 由於 b.fun(1) 傳入了 1,那麼這個時候 n = 1,就是以下

var b1 = 

}

以此類推後面也是一樣,然後 var b 部分得出的結果就是 : undefind , 0 , 1 ,  2

由上面的例子中可以得出  var c = fun(0).fun(1) 和 b 中的一樣 ,undefind , 0;此時 c 的方法就是

var c = 

}

那麼 c.fun( 2 ) , 得出的結果是 1 ;

而 c.fun(3) 中執行的方法其實也是 c 這個和 a 上面類似  結果也是 1 ,

因為 var  c  中的變數 n 並沒有變,變的是 c.fun(2) 返回的方法,更直觀一點  var dd = c.fun(2)  , 是 dd 變了 ,並不是 c

面試題 閉包問題

function console.log y console.log x console.log y 輸出結果為 1 console.log x 輸出結果為 error,直接報錯 解析宣告變數 從右向左賦值,可分解為 y 1 var x y 可見 y 為全域性變數,x為閉包函式內的區域性變數,在co...

JS閉包 面試題

function setobj p p.name bb var p setobj p console.log p 程式的執行結果是aa 匿名函式的this一般是指向window var number 2 var obj var fn1 obj.fn1 console.log number 匿名函式呼...

js閉包面試題

請看以下 在輸出臺的輸出情況 答案是4400,4401,4399,4400 首先,test函式做了什麼?test在自己的函式作用域內建立乙個變數n,以及乙個函式add,這時add就作為乙個閉包,它可以在外部訪問到test內部的變數n,並對其進行加法。然後test返回乙個物件,這個物件有乙個n變數以及...