溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JavaScript柯里化是什么

發(fā)布時(shí)間:2022-06-16 13:52:28 來源:億速云 閱讀:137 作者:iii 欄目:web開發(fā)

這篇“JavaScript柯里化是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“JavaScript柯里化是什么”文章吧。

JavaScript柯里化是什么

TypeScript 會(huì)取代JavaScript嗎?

  1. TypeScript只是帶來了類型的思維
    因?yàn)镴avaScript本身長(zhǎng)期沒有變量、函數(shù)參數(shù)等類型進(jìn)行限制
    這可能給我們項(xiàng)目帶來某種安全的隱患

  2. 在之后的JavaScript社區(qū)中出現(xiàn)了一系列的類型約束方案
    2014年,F(xiàn)acebook推出來flow來對(duì)JavaScript進(jìn)行類型檢查

3.Type源于JavaScript,歸于JavaScript

為什么需要JavaScript引擎

高級(jí)編程語(yǔ)言都需要轉(zhuǎn)換成最終的機(jī)器指令來執(zhí)行
事實(shí)上我們編寫的JavaScript無論交給瀏覽器或者Node執(zhí)行,最后都是需要被CPU執(zhí)行的
所以我們需要JavaScript引擎幫助我們將JavaScript代碼翻譯成CPU指令來執(zhí)行

瀏覽器內(nèi)核和JS引擎的關(guān)系

這里我們以WebKit為列,WebKit事實(shí)上由兩部分組成:
WebCore:負(fù)責(zé)HTML解析、布局、渲染等等相關(guān)的工作
JavaScriptCore:解析、執(zhí)行JavaScript代碼

變量環(huán)境 與 記錄

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í)行上下文

內(nèi)存管理 和 閉包

  1. 認(rèn)識(shí)內(nèi)存管理

JavaScript柯里化是什么

JS的內(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)存中開辟一塊空間,并將這塊空間的指針返回值變量引用

JS的垃圾回收

因?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的;
JavaScript柯里化是什么

我們?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è)閉包;

this指向

在全局作用域下:
瀏覽器:window
node環(huán)境:{}

箭頭函數(shù) arrow function

箭頭函數(shù)是ES6 之后增加的一種編寫函數(shù)的方法,并且它比函數(shù)表達(dá)式更加簡(jiǎn)潔;
箭頭函數(shù)不會(huì)綁定this、arguments屬性;
箭頭函數(shù)不能作為構(gòu)造函數(shù)來使用(不能和new一起來使用,會(huì)拋出錯(cuò)誤)

認(rèn)識(shí)arguments

arguments是一個(gè)對(duì)應(yīng)于 傳遞給函數(shù)的參數(shù)的類(偽)數(shù)組(array-like) 對(duì)象

理解JvaScript純函數(shù)

函數(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)生副作用;

副作用:

JavaScript 柯里化

柯里化也是屬于函數(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ù)

組合函數(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)

其他內(nèi)容

with語(yǔ)句

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函數(shù)

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)格模式 strict Mode

 嚴(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)和修正

  1. 無法意外的創(chuàng)建全局變量

// 1. 意外創(chuàng)建全局變量
    message = "Hello world"
    console.log(message)

    function foo() {
        age = 20
    }
    foo()
    console.log(age)
  1. 嚴(yán)格模式會(huì)時(shí)引起靜默失敗(silently fail ,注:不報(bào)錯(cuò)也沒有任何效果)的賦值操作拋出異常

//默認(rèn)靜態(tài)錯(cuò)誤
true.name ='xiaoluo';
NaN = 123
  1. 嚴(yán)格模式下試圖刪除不可刪除的屬性

  2. 嚴(yán)格模式不允許函數(shù)參數(shù)有相同的名稱

// 不允許函數(shù)參數(shù)有相同的名稱function foo(x,y,x) {
    console.log(x,y,x)}foo(10,20,30)
  1. 不允許0 的八進(jìn)制語(yǔ)法

var num = 0o123 // 八進(jìn)制
var num2 = 0x123 // 十六進(jìn)制
console.log(num,num2)
  1. 在嚴(yán)格模式下, 不允許使用with

var obj2 = {name:'Tom',age:18,message:'obj2'}

with(obj2) {
      console.log(message)
     }
  1. 在嚴(yán)格模式下,eval 不再為上層引用變量

var strFn = 'var message = "Hello world"; console.log(message);';
eval(strFn)
console.log(message)
  1. 嚴(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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI