記錄自己面試遇到的難題及分析

lio-mengxiang發表於2017-11-27

第一題

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的資料的問題。

相關文章