記錄本身面試遇到的難題及分析

第一題

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
複製代碼

這個題是來考察做用域鏈的,必須十分清楚怎樣造成做用域鏈,閉包是什麼造成的。咱們一步一步來分析到底每一步函數的調用,發生了什麼事情。javascript

var a = fun(0);
複製代碼

此時,fun(n , o)開始執行,形參n = 實參0 ,形參o 沒有傳入實參,因此運行console.log(o)的時候打印的是undefined,並且此時造成了一閉包,做用域上的變量的狀況以下java

接下來咱們看第二步發生了什麼面試

a.fun(1)
複製代碼

調用以前返回的那個對象,對象裏有一個閉包,就是a.fun這個函數,實際做用域鏈有兩條了,具體分析以下圖ajax

當fun(m ,n)調用完畢,就會造成上圖右側新的做用域鏈,而這個n用的變量倒是做圖fun做用域裏的n(m是本身傳的1) 記住,fun(m,n)調用完畢以後就消失了,因此後面的a.fun(2),也是 新建一個fun做用域,是跟上圖右邊是一個道理

好了,到這裏這個題已經結束了,由於無非就是新建做用域鏈和閉包做用域鏈之間的關係,
平時基本沒接觸過閉包,而且閉包裏面還要調用,注意了!!!=》不是閉包的函數,很繞吧,
我認爲底層發生的事情,我是說清楚了
複製代碼

第二題、關於js異步的題

當時考官問了我兩個關於異步的題,答的很差,回來我本身想了想,看了一些大神文章+看書叫你不知道的javascript中卷 關於e6promise的,基本解決了問題,後面準備專門寫一篇關於處理異步思路的文章promise

如下是第一題的示意圖

複製代碼

一、按鈕A按了以後,ajax請求的數據顯示在input type=text框裏,B按鈕也是。bash

  • 問題就是若是先按A,此時ajax發出去了,可是數據還沒返回來, 咱們等不及了,立刻按B按鈕,結果此時A按鈕請求的數據先回來,這就尷尬了,按的b按鈕,結果先顯示A按鈕返回的數據,怎麼解決?

二、解決思路,設置一個狀態變量,來控制ajax回調函數。 說的太抽象,舉個例子,ajax發出是這個樣子的:閉包

ajax(url A按鈕 , callbackA按鈕的回調函數),
ajax(url B按鈕 , callbackB按鈕的回調函數),
複製代碼

在callback上咱們作一下改動,設置一個全局變量異步

var status;  //值是undefined
複製代碼

咱們在點擊A按鈕的時候, 讓status的值變爲A函數

status = "A";
複製代碼

咱們在點擊B按鈕的時候,讓status的值變爲Bui

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的數據的問題。

相關文章
相關標籤/搜索