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變數以及...