成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript ES6相關(guān)的一些知識(shí)(/let、const/箭頭函數(shù)/Promise/gene

opengps / 998人閱讀

摘要:的精髓在于,用維護(hù)狀態(tài)傳遞狀態(tài)的方式使得回調(diào)函數(shù)能夠及時(shí)調(diào)用,比傳遞要簡單靈活的其他方法用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù),等同于部分和的區(qū)別在發(fā)生異常,在中捕獲不到能夠捕獲異常。

ES6是個(gè)啥

ECMAScript是國際通過的標(biāo)準(zhǔn)化腳本語言
JavaScript由ES,BOM,DOM組成
ES是JavaScript的語言規(guī)范,同時(shí)JavaScript是ES的實(shí)現(xiàn)和擴(kuò)展
6就是JavaScript語言的下一代標(biāo)準(zhǔn)

關(guān)于ES6的一些知識(shí) 1.let、const

ES5中的作用域有:函數(shù)作用域,全局作用域
ES6新增了塊級(jí)作用域。由{}包括(if和for語句也屬于塊級(jí)作用域)

{
    var a = 1;
    let b = 2;
    
}
console.log(a)//1
console.log(b)//undefined

let、const、var的區(qū)別
var:可以跨塊級(jí)作用域訪問,不能跨函數(shù)作用域訪問
let:只能在塊級(jí)作用域訪問,不能跨函數(shù)使用
const:定義常量,必須初始化且不能修改,只能在塊級(jí)作用域內(nèi)使用
關(guān)于變量提升:var不論聲明在何處都會(huì)莫默認(rèn)提升到函數(shù)/全局最頂部,但是let和const不會(huì)進(jìn)行變量提升

2.arrow function 箭頭函數(shù)

箭頭函數(shù)相當(dāng)于匿名函數(shù),簡化了函數(shù)的定義
定義就用=> 一個(gè)箭頭

箭頭函數(shù)有兩種格式:
第一種:只包含一個(gè)表達(dá)式

x=>x++

相當(dāng)于

function(x)}{
    return x++;
}

第二種:包含多條語句:

//包含判斷等
x=>{
    if(x>0){
        return x++;
    }
    else{
        x--;
    }
}
//多個(gè)參數(shù)
(x,y,z....)=>x+y+z+...+
//無參數(shù)
()=>1

//返回對(duì)象
x=>({obj:x})//注意符號(hào),避免和函數(shù)體的{}沖突

使用箭頭函數(shù)時(shí),函數(shù)體內(nèi)的this對(duì)象,就是定義時(shí)所在的對(duì)象

3.Promise

定義:Promise對(duì)象用于異步操作,它表示一個(gè)尚未完成且預(yù)計(jì)在未來完成的異步操作

關(guān)于同步&異步
JavaScript是基于事件驅(qū)動(dòng)的單線程運(yùn)行機(jī)制
(why: 瀏覽器中至少有三個(gè)線程:js引擎線程,gui渲染線程,瀏覽器事件觸發(fā)線程
js操作dom,瀏覽器事件觸發(fā)都會(huì)影響gui渲染效果,因此他們之間存在互斥的關(guān)系,使用多線程會(huì)帶來非常復(fù)雜的同步問題(a線程在某個(gè)DOM節(jié)點(diǎn)添加內(nèi)容。b線程刪除了該節(jié)點(diǎn))
同步:
即單線程模式,所有的任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧*,如函數(shù)調(diào)用后需要等待函數(shù)執(zhí)行結(jié)束后才能進(jìn)行下一個(gè)任務(wù),如果某個(gè)任務(wù)執(zhí)行時(shí)間過長(如死循環(huán)),容易造成線程阻塞,影響下面任務(wù)的正常進(jìn)行
異步:
可以一起執(zhí)行多個(gè)任務(wù),函數(shù)調(diào)用后不會(huì)立刻就返回執(zhí)行結(jié)果,異步任務(wù)會(huì)在當(dāng)前腳本所有的同步任務(wù)執(zhí)行結(jié)束后再執(zhí)行。異步任務(wù)不進(jìn)入主線程,而是進(jìn)入任務(wù)隊(duì)列,在某個(gè)任務(wù)可以執(zhí)行時(shí),等待主線程讀取任務(wù)隊(duì)列,隨后該任務(wù)將進(jìn)入主線程執(zhí)行
異步任務(wù)的實(shí)現(xiàn),最經(jīng)典的就是setTimeout()/setInterval()
他們的內(nèi)部運(yùn)行機(jī)制完全一樣,前者指定的代碼只執(zhí)行一次,后者為反復(fù)執(zhí)行

setTimeout(function(){
    console.log("taskA,yibu");
},0)

console.log("taskB,tongbu");
//taskB,tongbu
//taskA,yibu

即使延時(shí)事件為0,但由于它屬于異步任務(wù),仍需要等待同步任務(wù)執(zhí)行結(jié)束后再執(zhí)行

綜合看,整體的執(zhí)行順序?yàn)椋合葓?zhí)行執(zhí)行棧中的內(nèi)容,執(zhí)行完畢后,讀取任務(wù)隊(duì)列,尋找對(duì)應(yīng)的異步任務(wù),結(jié)束等待狀態(tài),進(jìn)入執(zhí)行棧執(zhí)行,不斷循環(huán)(Event Loop)
只要主線程空了,就會(huì)去讀取任務(wù)隊(duì)列

關(guān)于回調(diào)函數(shù),callback()
回調(diào)函數(shù)即是會(huì)被主線程掛起的代碼
異步任務(wù)必須指定回調(diào)函數(shù),當(dāng)主線程開始讀取任務(wù)隊(duì)列,執(zhí)行異步任務(wù)的時(shí)候,執(zhí)行的就是對(duì)應(yīng)的回調(diào)函數(shù)

言歸正傳,繼續(xù)理解Promise

promise的三種狀態(tài):

pending:初始狀態(tài)

fulfilled:操作成功

rejected:操作失敗

Promise可以由1->2/1->3一旦狀態(tài)變化,便會(huì)一直保持這個(gè)狀態(tài),不再改變。
當(dāng)狀態(tài)改變Promise.then綁定的函數(shù)就會(huì)被調(diào)用

構(gòu)建Promise

var promise = new Promise(function(resolve,reject){
    if(/*操作成功*/)
        resolve(data);
    else
        reject(error);
});

異步操作成功調(diào)用resolve,將結(jié)果作為參數(shù)傳遞出去
異步操作失敗調(diào)用reject,將報(bào)出的錯(cuò)誤作為參數(shù)傳遞出去

Promise構(gòu)建完成后,使用then方法指定resolve狀態(tài)和reject狀態(tài)的回調(diào)函數(shù)
promise.then(成功回調(diào)函數(shù),失敗的回調(diào)函數(shù)(非必要))
//這兩個(gè)函數(shù)都接受promise傳出的值作為參數(shù)

promise.then(function(data){do xxxx for success},function(error){do xxxx for failure});

Promise新建后就執(zhí)行,then方法指定的回調(diào)函數(shù)會(huì)在當(dāng)前腳本的所有同步任務(wù)執(zhí)行結(jié)束后再執(zhí)行

例子:

var promise = new Promise(function(resolve, reject) {
  console.log("before resolved");
  resolve();
  console.log("after resolved");
});

promise.then(function() {
  console.log("resolved");
});

console.log("outer");

//before resolved
//after resolved
//outer
//resolved

Promise的優(yōu)勢在于,可以在then方法中繼續(xù)寫Promise對(duì)象并返回,然后繼續(xù)調(diào)用then來進(jìn)行回調(diào)操作。能夠簡化層層回調(diào)的寫法。
Promise的精髓在于,用維護(hù)狀態(tài)、傳遞狀態(tài)的方式使得回調(diào)函數(shù)能夠及時(shí)調(diào)用,比傳遞callback要簡單、靈活

Promise的其他方法 .catch()

用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù),等同于reject部分
和reject的區(qū)別:
promise.then(onFulfilled,onRejected)在onFulfilled發(fā)生異常,在onRejected中捕獲不到
promise.then(onFulfilled).catch(onRejected)能夠捕獲異常。也可以用then替換,只是寫法不同。本質(zhì)上沒有區(qū)別

.all()

用于將多個(gè)Promise實(shí)例包裝成一個(gè)新的Promise實(shí)例

var p = Promise.all([p1, p2, p3]);

p1p2p3都需為promise實(shí)例
當(dāng)p1p2p3都為fulfilled時(shí),p才會(huì)變?yōu)閒ulfilled
只要有一個(gè)變?yōu)閞ejected,p就會(huì)變成rejected

.race()

用于將多個(gè)Promise實(shí)例包裝成一個(gè)新的Promise實(shí)例
與all()的區(qū)別類似于 AND 和 OR
p1p2p3有一個(gè)狀態(tài)發(fā)生改變,p的狀態(tài)就發(fā)生改變,并返回第一個(gè)改變狀態(tài)的promsie返回值,傳遞給p

.resolve()

看作new Promise()的快捷方式
實(shí)例:

Promise.resolve("Success");

/*******等同于*******/
new Promise(function (resolve) {
    resolve("Success");
});

讓對(duì)象立刻進(jìn)入resolved狀態(tài)

4.generate

可以將generate理解為一個(gè)能夠多次返回的“函數(shù)”

function* foo(x){
    yield x++;
    yield x+2;
    yield x+3;
    return x*x;
}

function*定義,并且yield也可以返回?cái)?shù)據(jù)

調(diào)用generate的方法:
不斷的使用next()

var f = foo(0);
console.log(f.next());// 0 false
console.log(f.next());// 3 false
console.log(f.next());// 4 false
console.log(f.next());// 1 true

使用for of結(jié)構(gòu)

for (var x of foo(0)) {
    console.log(x); // 依次輸出0 3 4 (沒有輸出1原因不詳)
}

每執(zhí)行一次后就暫停,返回的值就是yield的返回值,每次返回一個(gè)值,直到done為true,這個(gè)generate對(duì)象已經(jīng)全部執(zhí)行完畢
generate更像一個(gè)能夠記住執(zhí)行狀態(tài)的函數(shù)

實(shí)際上generate不算是一個(gè)函數(shù),它的返回值不是變量也不是函數(shù),而是一個(gè)可迭代的對(duì)象
該對(duì)象類似一個(gè)元素被定義好的數(shù)組,保存的是一種規(guī)則而不元素本身,不能夠隨機(jī)訪問,遍歷也只能夠遍歷一次,因?yàn)橐?guī)則只保存了上次的狀態(tài)

參考文檔1:講解JavaScript的線程運(yùn)作

參考文檔2:講解Promise

參考文檔3:關(guān)于generate

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103576.html

相關(guān)文章

  • es6一些知識(shí)點(diǎn)

    摘要:的一些知識(shí)點(diǎn)前言標(biāo)準(zhǔn)的一些區(qū)別塊級(jí)作用域全局作用域函數(shù)作用域全局作用域函數(shù)作用域變量提升的問題例子塊級(jí)作用域例如在一個(gè)函數(shù),循環(huán)。。。 es6的一些知識(shí)點(diǎn) 前言:es6(ECMAscript2015)標(biāo)準(zhǔn) let、const、var的一些區(qū)別 let、const 塊級(jí)作用域、全局作用域、函數(shù)作用域 var 全局作用域、函數(shù)作用域 變量提升的問題: var : ...

    cnio 評(píng)論0 收藏0
  • 學(xué)習(xí)React之前你需要知道JavaScript基礎(chǔ)知識(shí)

    摘要:和類在開始時(shí)遇到類組件,只是需要有關(guān)類的基礎(chǔ)。畢竟,中的條件呈現(xiàn)僅再次顯示大多數(shù)是而不是特定的任何內(nèi)容。 在我的研討會(huì)期間,更多的材料是關(guān)于JavaScript而不是React。其中大部分歸結(jié)為JavaScript ES6以及功能和語法,但也包括三元運(yùn)算符,語言中的簡寫版本,此對(duì)象,JavaScript內(nèi)置函數(shù)(map,reduce,filter)或更常識(shí)性的概念,如:可組合性,可重用...

    bitkylin 評(píng)論0 收藏0
  • JavaScript代碼改成ES6語法不完全指南

    摘要:無論是靜態(tài)變量還是塊級(jí)變量,都不能重復(fù)定義,否則會(huì)報(bào)錯(cuò)。當(dāng)存在多個(gè)嵌套的回調(diào)函數(shù)時(shí),代碼的縮進(jìn)層級(jí)將會(huì)非常多,不利于閱讀。如果只有一個(gè)回調(diào)函數(shù),不涉及到錯(cuò)誤處理,則不建議修改為的形式。回調(diào)函數(shù)常見于異步編程。 目錄 * 核心例子 * 修改成靜態(tài)變量(const)或塊級(jí)變量(let) * 開始修改 * 疑問解釋(重復(fù)定義會(huì)發(fā)生什么) * 疑問解釋(let的塊級(jí)作...

    ninefive 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<