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
好了,到這裏這個題已經結束了,由於無非就是新建做用域鏈和閉包做用域鏈之間的關係,
平時基本沒接觸過閉包,而且閉包裏面還要調用,注意了!!!=》不是閉包的函數,很繞吧,
我認爲底層發生的事情,我是說清楚了
複製代碼
當時考官問了我兩個關於異步的題,答的很差,回來我本身想了想,看了一些大神文章+看書叫你不知道的javascript中卷 關於e6promise的,基本解決了問題,後面準備專門寫一篇關於處理異步思路的文章promise
如下是第一題的示意圖
複製代碼
一、按鈕A按了以後,ajax請求的數據顯示在input type=text框裏,B按鈕也是。bash
二、解決思路,設置一個狀態變量,來控制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的數據的問題。