版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第JavaScript函數增強以及額外知識//varlogInfo=date=type=message={
//console.log(`時間:${date}類型:${type}內容:${message}`)
functionlogInfo(date){
returnfunction(type){
returnfunction(message){
console.log(`時間:${date}類型:${type}內容:${message}`)
varlogToday=logInfo("2025-06-01")
varlogTodayDebug=logToday("DEBUG")
varlogTodayFeature=logToday("FEATURE")
//打印debug日志
logTodayDebug("修復了從服務器請求數據后展示的bug")
logTodayDebug("修復界面搜索按鈕點擊的bug")
logTodayDebug("修復界面搜索按鈕點擊的bug")
logTodayDebug("修復界面搜索按鈕點擊的bug")
logTodayDebug("修復界面搜索按鈕點擊的bug")
logTodayFeature("新建過濾功能")
logTodayFeature("新建搜索功能")makeAdder
functionmakeAdder(count){
functionadd(num){
returncount+num
returnadd
//1.數字和5相加
varadder5=makeAdder(5)
adder5(10)
adder5(15)
adder5(18)
//2.數組和10相加
varadder10=makeAdder(10)
adder10(10)
adder10(16)
adder10(19)柯里化優(yōu)勢:
函數的職責單一函數的參數復用自動柯里化的函數封裝
//將一個普通函數轉化成柯里化函數
functioncurried(fn){
functioncurryFn(...args){
//傳入的參數大于等于fn的需要的參數個數,直接執(zhí)行fn函數
//否則返回新的函數繼續(xù)接收參數
if(args.length=fn.length){
returnfn.apply(this,args)
}else{
//返回新的函數并接收參數
returnfunction(...newArgs){
//遞歸調用currFn,此處的參數為上一次傳入的參數和之后傳入的參數
returncurryFn.apply(this,args.concat(newArgs))
returncurryFn
}
注意:函數柯里化性能并不高(使用到閉包,可能會導致內存泄露)
1.6組合函數的使用
組合函數多個函數組合在一起,依次調用
封裝組合函數
//傳入多個函數,自動的將多個函數組合在一起依次調用
functioncomposeFn(...fns){
varlength=fns.length
//邊界判斷
if(length=0)return
for(varfnoffns){
if(typeoffn!=="function"){
thrownewError("Expectedafunction")
returnfunction(...args){
//第一個函數可能傳入多個參數
varresult=fns[0].apply(this,args)
//之后的函數依次調用
for(vari=1;ilength;i++){
result=fns[i].apply(this,[result])
returnresult
}
二、額外知識
2.1with
with語句擴展一個語句的作用域鏈。
varobj={
message:"HelloWorld"
with(obj){
console.log(message)//HelloWorld
}不建議使用with語句,因為它可能是混淆錯誤和兼容性問題的根源
2.2eval
內建函數eval允許執(zhí)行一個代碼字符串
eval是一個特殊的函數,它可以將傳入的字符串當做JavaScript代碼來運行
eval會將最后一句執(zhí)行語句的結果,作為返回值
varmessage="HelloWorld"
varcodeString=`varname="kobe";console.log(name);console.log(message);"abc";`
varresult=eval(codeString)
console.log(result)//abc不建議在開發(fā)中使用eval:
eval代碼的可讀性非常的差(代碼的可讀性是高質量代碼的重要原則)
eval是一個字符串,那么有可能在執(zhí)行的過程中被刻意篡改,那么可能會造成被攻擊的風險
eval的執(zhí)行必須經過JavaScript解釋器,不能被JavaScript引擎優(yōu)化
2.3嚴格模式
什么是嚴格模式嚴格模式是一種具有限制性的JavaScript模式,從而使代碼隱式的脫離了懶散(sloppy)模式
支持嚴格模式的瀏覽器在檢測到代碼中有嚴格模式時,會以更加嚴格的方式對代碼進行檢測和執(zhí)行
嚴格模式對正常的JavaScript語義進行了一些限制:
嚴格模式通過拋出錯誤來消除一些原有的靜默(silent)錯誤
嚴格模式讓JS引擎在執(zhí)行代碼時可以進行更多的優(yōu)化(不需要對一些特殊的語法進行處理)
嚴格模式禁用了在ECMAScript未來版本中可能會定義的一些語法
如何開啟嚴格模式:嚴格模式通過在文件或者函數開頭使用usestrict來開啟
//給整個script開啟嚴格模式
"usestrict"
//給一個函數開啟嚴格模式
functionfoo(){
"usestrict"
}嚴格模式的限制:無法意外的創(chuàng)建全局變量
嚴格模式會使引起靜默失敗(silentlyfail,注:不報錯也沒有任何效果)的賦值操作拋出異常
嚴格模式下試圖刪除不可刪除的屬性
嚴格模式不允許函數參數有相同的名稱
不允許0的八進制語法
在嚴格模式下,不允許使用with
在嚴格模式下,eval不再為上層引用變量
嚴格模式下,this綁定不會默認轉成對象
"usestrict"
//1.不會意外創(chuàng)建全局變量
//functionfoo(){
//message="HelloWorld"
//foo()
//console.log(message)//報錯
//2.發(fā)現靜默錯誤
varobj={
name:"kobe"
Object.defineProperty(obj,"name",{
writable:false,
configurable:false
//="curry"
console.log()
//delete
console.log(obj)
//3.參數名稱不能相同
//functionfoo(num,num){
//4.不能以0開頭
//console.log(0o123)//0o是ES6新語法可以寫
//5.eval函數不能為上層創(chuàng)建變量
//eval(`varmessage="HelloWorld"`)
//console.log(message)
//6.嚴格模式下,this是不會轉成對
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 辦公場地租賃押金管理細則協議2025年
- 2024年中考道德與法治(上海)第二次模擬考試(含答案)
- 2025年海南省公需課學習-重點排污單位自動監(jiān)測數據標記規(guī)則第344期
- 冰點文庫撈鐵牛課件
- 2025年中考沈陽歷史試卷及答案
- 2025年共同條例考核試卷及答案
- 景區(qū)輪船維修合同范本
- 2025年高熱度智商測試題及答案
- 2025年行政管理常識題庫及答案
- 礦山承包協議合同范本
- 男性性教育課件
- 藝術鑒賞教程課件
- 三級醫(yī)院臨床科室醫(yī)療質量管理考核標準
- 2025 年高職酒店管理(人力資源管理)試題及答案
- 危重患者的容量管理
- 2025秋四年級上冊勞動技術期末測試卷(人教版)及答案(三套)
- 2025年應急物資準備安全培訓試卷及答案:物資管理人員應急物資使用測試
- 電商售后客服主管述職報告
- 2025昆明市呈貢區(qū)城市投資集團有限公司及下屬子公司第一批招聘(12人)筆試考試參考試題及答案解析
- 受控文件管理流程
- 2025年黑龍江省哈爾濱市中考數學真題含解析
評論
0/150
提交評論