您好,登錄后才能下訂單哦!
這篇“JavaScript柯里化是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“JavaScript柯里化是什么”文章吧。
TypeScript只是帶來了類型的思維
因?yàn)镴avaScript本身長(zhǎng)期沒有變量、函數(shù)參數(shù)等類型進(jìn)行限制
這可能給我們項(xiàng)目帶來某種安全的隱患
在之后的JavaScript社區(qū)中出現(xiàn)了一系列的類型約束方案
2014年,F(xiàn)acebook推出來flow來對(duì)JavaScript進(jìn)行類型檢查
3.Type源于JavaScript,歸于JavaScript
高級(jí)編程語(yǔ)言都需要轉(zhuǎn)換成最終的機(jī)器指令來執(zhí)行
事實(shí)上我們編寫的JavaScript無論交給瀏覽器或者Node執(zhí)行,最后都是需要被CPU執(zhí)行的
所以我們需要JavaScript引擎幫助我們將JavaScript代碼翻譯成CPU指令來執(zhí)行
這里我們以WebKit為列,WebKit事實(shí)上由兩部分組成:
WebCore:負(fù)責(zé)HTML解析、布局、渲染等等相關(guān)的工作
JavaScriptCore:解析、執(zhí)行JavaScript代碼
VO(Variable Object)變量對(duì)象 在最新的ECMA標(biāo)準(zhǔn)中,VO已經(jīng)有另外一個(gè)稱呼了變量環(huán)境 VE
GO(Clobal Object)全局對(duì)象,全局執(zhí)行上下文
AO(Activation Objece)包括了函數(shù)執(zhí)行上下文
認(rèn)識(shí)內(nèi)存管理
JavaScript會(huì)在定義變量時(shí)為我們分配內(nèi)存
JS對(duì)于基本數(shù)據(jù)類型內(nèi)存的分配會(huì)在執(zhí)行時(shí),直接在棧空間進(jìn)行分配;
JS對(duì)于復(fù)雜數(shù)據(jù)類型內(nèi)存的分配會(huì)在堆內(nèi)存中開辟一塊空間,并將這塊空間的指針返回值變量引用
因?yàn)?em>內(nèi)存的大小是有限的,所以當(dāng)內(nèi)存不再需要的時(shí)候,我們需要對(duì)其進(jìn)行釋放,以便騰出更多的內(nèi)存空間
垃圾回收的英文是 Garbage Collection 簡(jiǎn)稱GC
對(duì)于那先不再使用的對(duì)象,我們都稱之為是垃圾,它需要被回收,以釋放更多的內(nèi)存空間
而我們的語(yǔ)言運(yùn)行環(huán)境,比如java的運(yùn)行環(huán)境JVM,JavaScript的運(yùn)行環(huán)境js引擎都會(huì)內(nèi)存垃圾回收器
垃圾回收器我們也簡(jiǎn)稱GC,所以哎很多地方你看到 GC其實(shí)指的是垃圾回收器
在計(jì)算機(jī)科學(xué)中對(duì)閉包的定義(維基百科):
閉包(英語(yǔ):Closure),又稱詞法閉包(Lexical Closure) 或函數(shù)閉包(function closures);
是在支持頭等函數(shù)的編程語(yǔ)言中,實(shí)現(xiàn)詞法綁定的一種技術(shù);
閉包在實(shí)現(xiàn)上是一個(gè)結(jié)構(gòu)體,它存儲(chǔ)了一個(gè)函數(shù)和一個(gè)關(guān)聯(lián)的環(huán)境(相當(dāng)于一個(gè)符號(hào)查找表);
閉包跟函數(shù)最大的區(qū)別在于,當(dāng)捕捉閉包的時(shí)候,它的自由變量會(huì)在捕捉時(shí)被確定,這樣即使脫離了捕捉時(shí)的上下文,它也能照常運(yùn)行
閉包的概念出現(xiàn)于60年代,最早實(shí)現(xiàn)閉包的程序時(shí)Scheme,那么我們就可以理解為什么JavaScript中有閉包;
因?yàn)镴avaScript中有大量的設(shè)計(jì)是來源于Scheme的;
我們?cè)賮砜匆幌翸DN對(duì)JavaScript閉包的解釋:
一個(gè)函數(shù)和對(duì)其周圍狀態(tài)(lexical environment,詞法環(huán)境) 的引用捆綁在一起(或者說函數(shù)被引用包圍),這樣的組合就是閉包
也就是說,閉包讓你可以在一個(gè)內(nèi)層函數(shù)中訪問到其外層函數(shù)的作用域;
在JavaScript中,每當(dāng)創(chuàng)建一個(gè)函數(shù),閉包就會(huì)在函數(shù)創(chuàng)建的同時(shí)被創(chuàng)建出來;
function foo() { var name = 'why' var age = 18 function bar() { console.log('bar ',name) } return bar}var fun = foo()fun()
總結(jié):
一個(gè)普通的函數(shù)function,如果它可以訪問外層作用于的自由變量,那么這個(gè)函數(shù)就是一個(gè)閉包;
從廣義的角度來說:JavaScript中的函數(shù)都是閉包;
從狹義的角度來說:JavaScript中一個(gè)函數(shù),如果訪問了外層作用于的變量,那么它是一個(gè)閉包;
在全局作用域下:
瀏覽器:window
node環(huán)境:{}
箭頭函數(shù)是ES6 之后增加的一種編寫函數(shù)的方法,并且它比函數(shù)表達(dá)式更加簡(jiǎn)潔;
箭頭函數(shù)不會(huì)綁定this、arguments屬性;
箭頭函數(shù)不能作為構(gòu)造函數(shù)來使用(不能和new一起來使用,會(huì)拋出錯(cuò)誤)
arguments是一個(gè)對(duì)應(yīng)于 傳遞給函數(shù)的參數(shù)的類(偽)數(shù)組(array-like) 對(duì)象
函數(shù)式編程中有一個(gè)非常重要的概念叫做純函數(shù),JavaScript符合函數(shù)式編程的規(guī)范,所以也有純函數(shù)的概念;
純函數(shù)的維基百科定義:
在程序設(shè)計(jì)中,若一個(gè)函數(shù)符合以下條件,那么這個(gè)函數(shù)輩稱為純函數(shù)
此函數(shù)在相同的輸入值時(shí),需要產(chǎn)生相同的輸出
函數(shù)的輸出和輸入值以外的其他隱藏信息或狀態(tài)無關(guān),也和由I/O設(shè)備產(chǎn)生的外部輸出無關(guān)
改函數(shù)不能有語(yǔ)義上可觀察的函數(shù)副作用,諸如 “觸發(fā)事件”,使輸出設(shè)備輸出,或更改輸出值以外物件的內(nèi)容等
總結(jié):
確定的輸入,一定產(chǎn)生確定的輸出;
函數(shù)在執(zhí)行過程中,不能產(chǎn)生副作用;
副作用:
柯里化也是屬于函數(shù)式編程里面一個(gè)非常重要的概念
維基百科解釋:
在計(jì)算機(jī)科學(xué)中,柯里化(Currying) ,又譯為卡瑞化 或加里化
是八接收多個(gè)參數(shù)的函數(shù),變成接收一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù),而且返回結(jié)果的新函數(shù)
柯里化聲稱:如果你固定某些參數(shù),你將得到接受余下參數(shù)的一個(gè)函數(shù)
總結(jié):
只傳遞給函數(shù)一部分參數(shù)來調(diào)用它,讓它返回一個(gè)函數(shù)區(qū)處理剩余的參數(shù);
這個(gè)過程就稱為柯里化
為什么需要柯里化:
在函數(shù)式編程中,我們其實(shí)往往希望一個(gè)函數(shù)處理的問題盡可能的單一,而不是將一大堆的處理過程交給一個(gè)函數(shù)來處理
function foo(x,y,c) { return x + y + c } console.log(foo(10,20,30)) //柯里化 function sum(x) { return function(y) { return function(z) { return x + y + z } } } var a = sum(10)(20)(30) console.log(a ) //簡(jiǎn)化柯里化 var sum2 = x => y => z => { return x + y + z } console.log(sum2(10)(20)(30 ))
組合函數(shù)(Compose) 函數(shù)是在JavaScript開發(fā)中一種對(duì)函數(shù)的使用技巧、模式:
比如我們現(xiàn)在需要對(duì)某個(gè)數(shù)據(jù)進(jìn)行函數(shù)的調(diào)用,執(zhí)行兩個(gè)函數(shù)fn1 和 fn2,這兩個(gè)函數(shù)是依次執(zhí)行的
那么如果我們每次都需要進(jìn)行兩個(gè)函數(shù)的調(diào)用,操作上就會(huì)顯示的重復(fù)
那么是否可以將這兩個(gè)函數(shù)組合起來,自動(dòng)依次調(diào)用呢?
這個(gè)過程就是對(duì)函數(shù)的組合,我們稱之為組合函數(shù)(Compose Function)
with 語(yǔ)句
+作用: 可以形成自己的作用域
不建議使用with語(yǔ)句 ,因?yàn)樗赡苁腔煜e(cuò)誤和兼容性問題的根源
var obj2 = {name:'Tom',age:18,message:'obj2'} // var message = "hello world" function foo() { function bar () { with(obj2) { console.log(message) } } bar() } foo()
eval是一個(gè)特殊的函數(shù),它可以將傳入的字符串當(dāng)作JavaScript 代碼來運(yùn)行
var strFn = 'var message = "Hello world"; console.log(message);'; eval(strFn)
不建議在開發(fā)中使用eval:
eval代碼的可讀性非常的差(代碼的可讀性是高質(zhì)量代碼的重要原則);
eval是一個(gè)字符串,那么有可能在執(zhí)行的過程中輩可以篡改,那么可能會(huì)造成被攻擊的風(fēng)險(xiǎn);
eval的執(zhí)行必須經(jīng)過JS解釋器,不能不被JS引擎優(yōu)化;
嚴(yán)格模式是一種具有限制性的JavaScript模式,從而使代碼隱式的脫離了"懶散(sloppy) 模式" 支持嚴(yán)格模式的瀏覽器在監(jiān)測(cè)到代碼中有嚴(yán)格模式時(shí),會(huì)以更加嚴(yán)格的方式對(duì)代碼進(jìn)行監(jiān)測(cè)和執(zhí)行 嚴(yán)格模式通過拋出錯(cuò)誤來消除一些原有的靜默(silent)錯(cuò)誤 嚴(yán)格模式讓Js引擎周期執(zhí)行代碼時(shí)可以進(jìn)行更多的優(yōu)化(不需要對(duì)一些特殊的語(yǔ)法進(jìn)行處理)
"use strict"; // 開啟嚴(yán)格模式var message = "hello world"console.log(message)
嚴(yán)格模式限制
這里我們來說幾個(gè)嚴(yán)格模式下的嚴(yán)格語(yǔ)法限制:
JavaScript被設(shè)計(jì)為新手開發(fā)者更容易上手,所以有時(shí)候本來錯(cuò)誤語(yǔ)法,被認(rèn)為也是可以正常被解析的
但是在嚴(yán)格模式下,這種失誤會(huì)被當(dāng)成錯(cuò)誤,以便可以快速的發(fā)現(xiàn)和修正
無法意外的創(chuàng)建全局變量
// 1. 意外創(chuàng)建全局變量 message = "Hello world" console.log(message) function foo() { age = 20 } foo() console.log(age)
嚴(yán)格模式會(huì)時(shí)引起靜默失敗(silently fail ,注:不報(bào)錯(cuò)也沒有任何效果)的賦值操作拋出異常
//默認(rèn)靜態(tài)錯(cuò)誤 true.name ='xiaoluo'; NaN = 123
嚴(yán)格模式下試圖刪除不可刪除的屬性
嚴(yán)格模式不允許函數(shù)參數(shù)有相同的名稱
// 不允許函數(shù)參數(shù)有相同的名稱function foo(x,y,x) { console.log(x,y,x)}foo(10,20,30)
不允許0 的八進(jìn)制語(yǔ)法
var num = 0o123 // 八進(jìn)制 var num2 = 0x123 // 十六進(jìn)制 console.log(num,num2)
在嚴(yán)格模式下, 不允許使用with
var obj2 = {name:'Tom',age:18,message:'obj2'} with(obj2) { console.log(message) }
在嚴(yán)格模式下,eval 不再為上層引用變量
var strFn = 'var message = "Hello world"; console.log(message);'; eval(strFn) console.log(message)
嚴(yán)格模式下,this綁定不會(huì)默認(rèn)轉(zhuǎn)成對(duì)象
嚴(yán)格模式下,自執(zhí)行函數(shù)會(huì)指向undefined
function foo() { console.log(this) //undefined } foo()
以上就是關(guān)于“JavaScript柯里化是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。