最近面試經常碰到這樣一道題(或者類似):ps.因為我阿姨不會就詳細分析吧。
var btns = document.getelementsbyclassname('btn');
for(let i = 0; i < btns.length; i++)
}
這個之前說過,因為面試的時候,說了主要看閉包。所以也沒有多想。
function fun(),0);
}}fun();
其實,通過分析就不難看出,核心點問題都是, 在乙個迴圈內,延時列印迴圈變數。 所有的結果一樣。
因為js的變數有提公升作用,所以可以將程式改成成更加直觀的形式。
var i = 0;
function fun(),1000);
i++; // 這裡訪問的i 也是 之前定義的 i
}}fun();
我們改成程式之後,就可以看到了。 列印語句的i,因為都是在等待i變換之後,取i值列印, 所以結果一樣。
這裡產生問題的原因在於:
for語句不會像其他語言具有塊級作用域(也是js變數宣告提公升)。
所有的訪問迴圈變數的值,都是延時訪問了。
訪問的i都指向同乙個i。
其實,核心問題,就是等待迴圈結束,才去訪問i,而且訪問的是同乙個i。
解決思路:兩種 改變訪問時機, 改變訪問變數。
for( var i = 0; i < 5; i++)
這樣做好像沒什麼意義。
讓for語句具有塊級作用域
這是es6的語法規則: 使用let. (這是最簡單的一種形式)
function fun(),0);
}}fun();
用let代替var來宣告變數,就可以把變數的作用域限制在當前**塊中也就是{}
使用閉包
函式是具有自己的作用域的。在es6之前,都是使用閉包來實現塊作用域
function fun()
})(i),0);
}}fun();
其實, 也就是用 立即執行函式引數i_ 來儲存 i 值 。 當然你也可以把i_寫成i。
分割線(這對之前問題的處理)
使用settime呼叫時候可以傳遞引數的特性。
難道之前面試問我的是這麼做?
function fun()); // 這個是立即執行
promise.then(function(value)) }}
fun();
下面**也可以實現,其實,你就會發現, 這是因為 settimeout 函式 可以呼叫給函式傳遞引數的原因, 。
function fun(),0,i); }}
fun();
記一次面試
1 給定乙個字串str,怎麼判斷它是否是乙個陣列arr的鍵名?array keys exists str,arr 2 dns協議怎麼工作的?dns是應用層協議 實現ip與網域名稱的對映,將網域名稱轉成對應的ip位址。3 怎樣判斷乙個陣列是否為空?count arr 和empty arr 4 開啟檔案...
記一次實習面試
今天去面試。有點遲,約好10點,遲了10分鐘左右,估計給人印象不太好,這裡提醒自己下次早點到。這次面試的一間公司,叫會掌櫃,0,0其實不知道叫拓源新思覺還是叫會掌櫃,看了他們會掌櫃這個 感覺挺新穎的,會務服務的一條龍服務。辦公在光大銀行大廈707,附近地鐵3號線,華師c出口左轉過馬路就是了。辦公環境...
記一次面試經歷
今早七點半的巴士從中山趕到廣州面試php開發助理,以前面的都是十來人 幾十人的小公司,不少還是培訓公司,坑的一逼!這次的公司不錯,比較正規,好歹上百人了,只是筆試題做得一般,題目有的雖有學過,但忘了,好吧!這就是沒準備充分的緣故!下面羅列下我還記得的題目 有些漏了就沒辦法了 之後hr面試聊了下,雖然...