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之間的換算(移動端)

一些面試題:
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面試題(含答案)