JavaScript函數增強以及額外知識_第1頁
JavaScript函數增強以及額外知識_第2頁
JavaScript函數增強以及額外知識_第3頁
JavaScript函數增強以及額外知識_第4頁
JavaScript函數增強以及額外知識_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論