什么是函數(shù)防抖和函數(shù)節(jié)流永票?有什么區(qū)別?
函數(shù)防抖驮俗,就是指觸發(fā)事件后在 n 秒內(nèi)函數(shù)只能執(zhí)行一次懂缕,如果在 n 秒內(nèi)又觸發(fā)了事件允跑,則會重新計算函數(shù)執(zhí)行時間王凑。
函數(shù)節(jié)流,就是限制一個函數(shù)在一定時間內(nèi)只能執(zhí)行一次聋丝。
什么是函數(shù)柯里化及有什么用索烹?
函數(shù)柯里化
就是給函數(shù)分步傳遞參數(shù),每次傳遞部分參數(shù)弱睦,并返回一個更具體的函數(shù)接收剩下的參數(shù)百姓,這中間可嵌套多層這樣的接收部分參數(shù)的函數(shù),直至返回最后結(jié)果况木。
函數(shù)柯里化有什么用垒拢?
通過函數(shù)柯里化旬迹,我們可以實現(xiàn)參數(shù)復(fù)用、提前返回和延遲執(zhí)行求类。通過函數(shù)柯里化奔垦,在不同的情況下傳遞不同的參數(shù)
談?wù)勀K化開發(fā)
什么是模塊化開發(fā)?
模塊就是完成單一的職責(zé)的功能函數(shù)或者代碼塊尸疆。
模塊化開發(fā)是指如何開發(fā)新的模塊和復(fù)用已有的模塊來實現(xiàn)應(yīng)用的功能椿猎。
為什么要模塊化開發(fā)?
可維護性
可測試性
按需加載
代碼復(fù)用
利于架構(gòu)
利于協(xié)作
對于我們前端來說寿弱,特別是解決了javascript中命名空間以及文件依賴的問題犯眠。
模塊化開發(fā)的規(guī)范
CommonJS
用于服務(wù)端模塊化編程,Node.js就采用此規(guī)范症革;
一個文件就是一個模塊筐咧,require方法用來加載模塊,該方法讀取一個文件并執(zhí)行地沮,最后返回文件內(nèi)部的module.exports對象嗜浮;
AMD
require.js(前端模塊化管理的工具庫)實現(xiàn)js文件的異步加載,避免網(wǎng)頁失去響應(yīng)摩疑;管理模塊之間的依賴性危融,便于代碼的編寫和維護;require.js是使用創(chuàng)建script元素雷袋,通過指定script元素的src屬性來實現(xiàn)加載模塊的吉殃;
依賴前置,盡早的執(zhí)行模依賴塊楷怒,執(zhí)行順序不一定蛋勺;
CMD
Sea.js 依賴就近,且在真正需要使用依賴模塊時才執(zhí)行該模塊鸠删,順序固定抱完;
AMD和CMD最大的區(qū)別是對依賴模塊的執(zhí)行時機處理不同,而不是加載的時機或者方式不同刃泡,二者皆為異步加載模塊巧娱;
AMD依賴前置,js可以方便知道依賴模塊是誰烘贴,立即加載禁添;而CMD就近依賴,需要使用把模塊變?yōu)樽址馕鲆槐椴胖酪蕾嚵四切┠K桨踪。
ES6
ES6使用的是基于文件的模塊老翘。所以必須一個文件一個模塊,不能將多個模塊合并到單個文件中去。
ES6模塊API是靜態(tài)的铺峭,一旦導(dǎo)入模塊后墓怀,無法再在程序運行過程中增添方法。
ES6模塊采用引用綁定(可以理解為指針)卫键。這點和CommonJS中的值綁定不同捺疼,如果你的模塊在運行過程中修改了導(dǎo)出的變量值,就會反映到使用模塊的代碼中去永罚。所以啤呼,不推薦在模塊中修改導(dǎo)出值,導(dǎo)出的變量應(yīng)該是靜態(tài)的呢袱。
ES6模塊采用的是單例模式官扣,每次對同一個模塊的導(dǎo)入其實都指向同一個實例。
另外羞福,ES6模塊好處很多惕蹄,但是并不支持按需加載的功能, 而按需加載又是Web性能優(yōu)化中重要的一個環(huán)節(jié)。好在我們可以借助Webpack來彌補這一缺陷
談?wù)勀銓ψ饔糜蜴湹睦斫?/h2>
什么是作用域治专?
作用域就是變量與函數(shù)的可訪問范圍卖陵。在JavaScript中,變量的作用域有全局作用域和局部作用域张峰,在ES6之后泪蔫,又添加了塊級作用域的概念,所以在JavaScript中有三種作用域喘批。對于javascript而言撩荣,我們定義在局部作用域或者塊級作用的變量,會存放在scope局部作用域?qū)ο笊先纳睿x在全局作用域的變量餐曹,會存放在window/global這個全局對象上。
當(dāng)我們在局部/塊級作用域中敌厘,調(diào)用一個外部的變量時台猴,就會產(chǎn)生作用域鏈。函數(shù)在哪里創(chuàng)建俱两,它就會從哪里開始向上查找變量饱狂;而不是函數(shù)在哪里調(diào)用。
什么是深拷貝锋华?什么是淺拷貝嗡官?如何實現(xiàn)一個深拷貝函數(shù)箭窜?
深拷貝和淺拷貝都是針對于引用類型(Object)而言毯焕,對于基本數(shù)據(jù)類型而言,賦值直接就是深拷貝。
淺拷貝有兩種定義纳猫,一種是直接賦值引用婆咸,另一種是只拷貝對象的第一層屬性,更深層次的引用還是相同的芜辕;
深拷貝就是將原有對象重新拷貝一份尚骄,不論是修改哪一部分的值,都不會對原有對象造成影響侵续【笳桑拷貝的永遠(yuǎn)是值,而不是引用状蜗。