亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript柯里化是什么

發布時間:2022-06-16 13:52:28 來源:億速云 閱讀:138 作者:iii 欄目:web開發

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

JavaScript柯里化是什么

TypeScript 會取代JavaScript嗎?

  1. TypeScript只是帶來了類型的思維
    因為JavaScript本身長期沒有變量、函數參數等類型進行限制
    這可能給我們項目帶來某種安全的隱患

  2. 在之后的JavaScript社區中出現了一系列的類型約束方案
    2014年,Facebook推出來flow來對JavaScript進行類型檢查

3.Type源于JavaScript,歸于JavaScript

為什么需要JavaScript引擎

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

瀏覽器內核和JS引擎的關系

這里我們以WebKit為列,WebKit事實上由兩部分組成:
WebCore:負責HTML解析、布局、渲染等等相關的工作
JavaScriptCore:解析、執行JavaScript代碼

變量環境 與 記錄

VO(Variable Object)變量對象 在最新的ECMA標準中,VO已經有另外一個稱呼了變量環境 VE

GO(Clobal Object)全局對象,全局執行上下文

AO(Activation Objece)包括了函數執行上下文

內存管理 和 閉包

  1. 認識內存管理

JavaScript柯里化是什么

JS的內存管理

JavaScript會在定義變量時為我們分配內存
JS對于基本數據類型內存的分配會在執行時,直接在棧空間進行分配;
JS對于復雜數據類型內存的分配會在堆內存中開辟一塊空間,并將這塊空間的指針返回值變量引用

JS的垃圾回收

因為內存的大小是有限的,所以當內存不再需要的時候,我們需要對其進行釋放,以便騰出更多的內存空間

垃圾回收的英文是 Garbage Collection 簡稱GC
對于那先不再使用的對象,我們都稱之為是垃圾,它需要被回收,以釋放更多的內存空間
而我們的語言運行環境,比如java的運行環境JVM,JavaScript的運行環境js引擎都會內存垃圾回收器
垃圾回收器我們也簡稱GC,所以哎很多地方你看到 GC其實指的是垃圾回收器

深入閉包

在計算機科學中對閉包的定義(維基百科):
閉包(英語:Closure),又稱詞法閉包(Lexical Closure) 或函數閉包(function closures);
是在支持頭等函數的編程語言中,實現詞法綁定的一種技術;
閉包在實現上是一個結構體,它存儲了一個函數和一個關聯的環境(相當于一個符號查找表);
閉包跟函數最大的區別在于,當捕捉閉包的時候,它的自由變量會在捕捉時被確定,這樣即使脫離了捕捉時的上下文,它也能照常運行

閉包的概念出現于60年代,最早實現閉包的程序時Scheme,那么我們就可以理解為什么JavaScript中有閉包;
因為JavaScript中有大量的設計是來源于Scheme的;
JavaScript柯里化是什么

我們再來看一下MDN對JavaScript閉包的解釋:
一個函數和對其周圍狀態(lexical environment,詞法環境) 的引用捆綁在一起(或者說函數被引用包圍),這樣的組合就是閉包
也就是說,閉包讓你可以在一個內層函數中訪問到其外層函數的作用域;
在JavaScript中,每當創建一個函數,閉包就會在函數創建的同時被創建出來;

function foo() {
    var name = 'why'
    var age = 18
    function bar() {
        console.log('bar ',name)
    }
    return bar}var fun = foo()fun()

總結:
一個普通的函數function,如果它可以訪問外層作用于的自由變量,那么這個函數就是一個閉包;
從廣義的角度來說:JavaScript中的函數都是閉包;
從狹義的角度來說:JavaScript中一個函數,如果訪問了外層作用于的變量,那么它是一個閉包;

this指向

在全局作用域下:
瀏覽器:window
node環境:{}

箭頭函數 arrow function

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

認識arguments

arguments是一個對應于 傳遞給函數的參數的類(偽)數組(array-like) 對象

理解JvaScript純函數

函數式編程中有一個非常重要的概念叫做純函數,JavaScript符合函數式編程的規范,所以也有純函數的概念;

純函數的維基百科定義:
在程序設計中,若一個函數符合以下條件,那么這個函數輩稱為純函數
此函數在相同的輸入值時,需要產生相同的輸出
函數的輸出和輸入值以外的其他隱藏信息或狀態無關,也和由I/O設備產生的外部輸出無關
改函數不能有語義上可觀察的函數副作用,諸如 “觸發事件”,使輸出設備輸出,或更改輸出值以外物件的內容等
總結:
確定的輸入,一定產生確定的輸出;
函數在執行過程中,不能產生副作用;

副作用:

JavaScript 柯里化

柯里化也是屬于函數式編程里面一個非常重要的概念
維基百科解釋:
在計算機科學中,柯里化(Currying) ,又譯為卡瑞化 或加里化
是八接收多個參數的函數,變成接收一個單一參數(最初函數的第一個參數)的函數,并且返回接受余下的參數,而且返回結果的新函數
柯里化聲稱:如果你固定某些參數,你將得到接受余下參數的一個函數

總結:
只傳遞給函數一部分參數來調用它,讓它返回一個函數區處理剩余的參數;
這個過程就稱為柯里化

為什么需要柯里化:
在函數式編程中,我們其實往往希望一個函數處理的問題盡可能的單一,而不是將一大堆的處理過程交給一個函數來處理

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 )

//簡化柯里化
var sum2 = x => y => z => {
    return x + y + z
}
console.log(sum2(10)(20)(30 ))

組合函數

組合函數(Compose) 函數是在JavaScript開發中一種對函數的使用技巧、模式:
比如我們現在需要對某個數據進行函數的調用,執行兩個函數fn1 和 fn2,這兩個函數是依次執行的
那么如果我們每次都需要進行兩個函數的調用,操作上就會顯示的重復
那么是否可以將這兩個函數組合起來,自動依次調用呢?
這個過程就是對函數的組合,我們稱之為組合函數(Compose Function)

其他內容

with語句

with 語句
+作用: 可以形成自己的作用域
不建議使用with語句 ,因為它可能是混淆錯誤和兼容性問題的根源

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

// var message = "hello world"

function foo() {
function bar () {
     with(obj2) {
          console.log(message)
     }
}
bar()
}
foo()
eval函數

eval是一個特殊的函數,它可以將傳入的字符串當作JavaScript 代碼來運行

   var strFn = 'var message = "Hello world"; console.log(message);';
   eval(strFn)

不建議在開發中使用eval:
eval代碼的可讀性非常的差(代碼的可讀性是高質量代碼的重要原則);
eval是一個字符串,那么有可能在執行的過程中輩可以篡改,那么可能會造成被攻擊的風險;
eval的執行必須經過JS解釋器,不能不被JS引擎優化;

嚴格模式 strict Mode

 嚴格模式是一種具有限制性的JavaScript模式,從而使代碼隱式的脫離了"懶散(sloppy) 模式"
 支持嚴格模式的瀏覽器在監測到代碼中有嚴格模式時,會以更加嚴格的方式對代碼進行監測和執行

 嚴格模式通過拋出錯誤來消除一些原有的靜默(silent)錯誤
 嚴格模式讓Js引擎周期執行代碼時可以進行更多的優化(不需要對一些特殊的語法進行處理)
"use strict"; // 開啟嚴格模式var message = "hello world"console.log(message)

嚴格模式限制
這里我們來說幾個嚴格模式下的嚴格語法限制:
JavaScript被設計為新手開發者更容易上手,所以有時候本來錯誤語法,被認為也是可以正常被解析的
但是在嚴格模式下,這種失誤會被當成錯誤,以便可以快速的發現和修正

  1. 無法意外的創建全局變量

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

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

//默認靜態錯誤
true.name ='xiaoluo';
NaN = 123
  1. 嚴格模式下試圖刪除不可刪除的屬性

  2. 嚴格模式不允許函數參數有相同的名稱

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

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

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

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

var strFn = 'var message = "Hello world"; console.log(message);';
eval(strFn)
console.log(message)
  1. 嚴格模式下,this綁定不會默認轉成對象
    嚴格模式下,自執行函數會指向undefined

function foo() {
    console.log(this) //undefined
}
foo()

以上就是關于“JavaScript柯里化是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灵璧县| 蒙城县| 上蔡县| 陆丰市| 井陉县| 呼和浩特市| 巫山县| 达孜县| 晋中市| 钟山县| 安仁县| 莒南县| 麦盖提县| 琼中| 大荔县| 延津县| 休宁县| 湾仔区| 淮阳县| 滦南县| 临沂市| 赤城县| 昭平县| 绥中县| 隆安县| 朝阳市| 遂平县| 安塞县| 鄂托克前旗| 景泰县| 理塘县| 财经| 林口县| 德化县| 美姑县| 泸定县| 江北区| 台州市| 松原市| 迭部县| 长沙市|