21年前端面試題(吐血整理,持續(xù)補(bǔ)充)

js,node.js基礎(chǔ):

閉包

閉包是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在js中,只有函數(shù)內(nèi)部的子函數(shù)可以訪問內(nèi)部變量,所以可以把閉包理解為定義在函數(shù)內(nèi)部的函數(shù)。在本質(zhì)上,閉包是將函數(shù)內(nèi)部和函數(shù)外部連接起來的橋梁。
Javascript中閉包的創(chuàng)建過程,如以下程序所示。

代碼

function a(){

var i=0;

function b(){

alert(++i);

}

return b;

}var c=a();

c();

特點(diǎn)

這段代碼有兩個特點(diǎn):

1、函數(shù)b嵌套在函數(shù)a內(nèi)部;

2、函數(shù)a返回函數(shù)b。

這樣在執(zhí)行完var c=a( )后,變量c實(shí)際上是指向了函數(shù)b,再執(zhí)行c( )后就會彈出一個窗口顯示i的值(第一次為1)。這段代碼其實(shí)就創(chuàng)建了一個閉包,這是因?yàn)楹瘮?shù)a外的變量c引用了函數(shù)a內(nèi)的函數(shù)b。也就是說,當(dāng)函數(shù)a的內(nèi)部函數(shù)b被函數(shù)a外的一個變量引用的時候,就創(chuàng)建了一個閉包。

作用

簡而言之,閉包的作用就是在a執(zhí)行完并返回后,閉包使得Javascript的垃圾回收機(jī)制不會收回a所占用的資源,因?yàn)閍的內(nèi)部函數(shù)b的執(zhí)行需要依賴a中的變量。

在上面的例子中,由于閉包的存在使得函數(shù)a返回后,a中的i始終存在,這樣每次執(zhí)行c(),i都是自加1后alert出i的值。

那 么我們來想象另一種情況,如果a返回的不是函數(shù)b,情況就完全不同了。因?yàn)閍執(zhí)行完后,b沒有被返回給a的外界,只是被a所引用,而此時a也只會被b引 用,因此函數(shù)a和b互相引用但又不被外界打擾(被外界引用),函數(shù)a和b就會被回收。

使用注意點(diǎn)

(1)由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,所以不能濫用閉包,否則會造成網(wǎng)頁的性能問題,在IE中可能導(dǎo)致內(nèi)存泄露。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。

(2)閉包會在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。所以,如果把父函數(shù)當(dāng)作對象(object)使用,把閉包當(dāng)作它的公用方法(Public Method),把內(nèi)部變量當(dāng)作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數(shù)內(nèi)部變量的值。

作用域

參考文檔

什么是原型鏈

原型鏈

變量提升

this指向問題

new 操作符做了什么?

使用new命令時,它后面的函數(shù)依次執(zhí)行下面的步驟。

1.創(chuàng)建一個空對象,作為將要返回的對象實(shí)例。
2.將這個空對象的原型,指向構(gòu)造函數(shù)的prototype屬性。
3.將這個空對象賦值給函數(shù)內(nèi)部的this關(guān)鍵字。
4.開始執(zhí)行構(gòu)造函數(shù)內(nèi)部的代碼。

ES5實(shí)現(xiàn)繼承之一

ES5實(shí)現(xiàn)繼承之二

堆、棧、隊(duì)列是什么?都有什么區(qū)別?有什么應(yīng)用?

深復(fù)制與淺復(fù)制

typedArray問題

es6使用箭頭函數(shù)需要注意的問題

let 會提升嗎?聲明、初始化、賦值等概念。

暫時性死區(qū)

暫時性死區(qū)的本質(zhì)就是,只要一進(jìn)入當(dāng)前作用域,所要使用的變量就已經(jīng)存在了,但是不可獲取,只有等到聲明變量的那一行代碼出現(xiàn),才可以獲取和使用該變量。

了解前端模塊化嗎?有幾種規(guī)范?

css、html、dom、瀏覽器相關(guān)基礎(chǔ)

webpack

Js的內(nèi)存泄漏場景/監(jiān)控以及分析

宏任務(wù)和微任務(wù)

vue中watch不觸發(fā)、不生效的解決辦法及原理

vue中mixins(混入)的使用

vue組件中的通信方式

JS事件之事件流機(jī)制

百度美團(tuán)面試題

var,let,const的區(qū)別

typescript中的map數(shù)據(jù)存儲

Map與WeakMap的區(qū)別與使用

hash路由和history路由的區(qū)別

VUEX-action可以修改state嗎

字符串的常見操作

二維數(shù)組轉(zhuǎn)一維數(shù)組再排序

vuex的存值和取值的操作

路由傳參的三種方法

rem與px之間的換算(移動端)

首屏優(yōu)化加載
一些面試題:

vuex,路由,mvvm,set get,flex,bfc,兩個對象合并,兩個互不相關(guān)的組件如何調(diào)用其內(nèi)的方法,擴(kuò)展運(yùn)算符的使用場景,nexttick的原理以及怎么修改表單數(shù)據(jù),nextTick和settimeout的區(qū)別,route和router的區(qū)別,mixin,promise.all及實(shí)現(xiàn)方式,px和rem的換算,水平垂直居中,websocket,less常用的寫法,es7異步編程及sleep()寫法

其他博主的面試分享題(僅供參考)
面試題一
面試題二
20道vue面試題(含答案)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容