第一題
function fun(n,o){
console.log(n,o) // 注意了,這裡是輸出n和o,跟一般網上流傳的面試題不一樣哦
return {
fun:function(m){
console.log(n); // 注意了,這裡又要輸出n,跟網上流傳的面試題也不一樣哦,真是真正考驗你能力的時候
return fun(m,n);
}
}
}
var a=fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
以上輸出0 undefined 0,
1 0 0,
2 0 0,
3 0
複製程式碼
這個題是來考察作用域鏈的,必須十分清楚怎樣形成作用域鏈,閉包是什麼形成的。我們一步一步來分析到底每一步函式的呼叫,發生了什麼事情。
var a = fun(0);
複製程式碼
此時,fun(n , o)開始執行,形參n = 實參0 ,形參o 沒有傳入實參,所以執行console.log(o)的時候列印的是undefined,而且此時形成了一閉包,作用域上的變數的情況如下
接下來我們看第二步發生了什麼
a.fun(1)
複製程式碼
呼叫之前返回的那個物件,物件裡有一個閉包,就是a.fun這個函式,實際作用域鏈有兩條了,具體分析如下圖
當fun(m ,n)呼叫完畢,就會形成上圖右側新的作用域鏈,而這個n用的變數卻是作圖fun作用域裡的n(m是自己傳的1) 記住,fun(m,n)呼叫完畢之後就消失了,所以後面的a.fun(2),也是 新建一個fun作用域,是跟上圖右邊是一個道理好了,到這裡這個題已經結束了,因為無非就是新建作用域鏈和閉包作用域鏈之間的關係,
平時基本沒接觸過閉包,並且閉包裡面還要呼叫,注意了!!!=》不是閉包的函式,很繞吧,
我認為底層發生的事情,我是說清楚了
複製程式碼
第二題、關於js非同步的題
當時考官問了我兩個關於非同步的題,答的不好,回來我自己想了想,看了一些大神文章+看書叫你不知道的javascript中卷 關於e6promise的,基本解決了問題,後面準備專門寫一篇關於處理非同步思路的文章
以下是第一題的示意圖
複製程式碼
1、按鈕A按了之後,ajax請求的資料顯示在input type=text框裡,B按鈕也是。
- 問題就是如果先按A,此時ajax發出去了,但是資料還沒返回來, 我們等不及了,馬上按B按鈕,結果此時A按鈕請求的資料先回來,這就尷尬了,按的b按鈕,結果先顯示A按鈕返回的資料,怎麼解決?
2、解決思路,設定一個狀態變數,來控制ajax回撥函式。 說的太抽象,舉個例子,ajax發出是這個樣子的:
ajax(url A按鈕 , callbackA按鈕的回撥函式),
ajax(url B按鈕 , callbackB按鈕的回撥函式),
複製程式碼
在callback上我們做一下改動,設定一個全域性變數
var status; //值是undefined
複製程式碼
我們在點選A按鈕的時候, 讓status的值變為A
status = "A";
複製程式碼
我們在點選B按鈕的時候,讓status的值變為B
status = "B";
複製程式碼
也就是callabck改成這樣:
if(status = "A") {
// 點選A按鈕status就變為“A”,所以不會執行按鈕B的回撥函式
執行 callbackA() A按鈕的回撥函式
}else if(status = "B"){
// 點選B按鈕status就變為“B”,所以不會執行按鈕A的回撥函式
執行 callbackB() B按鈕的回撥函式
}
複製程式碼
這樣就解決了點A只顯示A的資料,點B只顯示B的資料的問題。