摘要:的精髓在于,用維護(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)
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)行變量提升
箭頭函數(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要簡單、靈活
用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù),等同于reject部分
和reject的區(qū)別:
promise.then(onFulfilled,onRejected)在onFulfilled發(fā)生異常,在onRejected中捕獲不到
promise.then(onFulfilled).catch(onRejected)能夠捕獲異常。也可以用then替換,只是寫法不同。本質(zhì)上沒有區(qū)別
用于將多個(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
用于將多個(gè)Promise實(shí)例包裝成一個(gè)新的Promise實(shí)例
與all()的區(qū)別類似于 AND 和 OR
p1p2p3有一個(gè)狀態(tài)發(fā)生改變,p的狀態(tài)就發(fā)生改變,并返回第一個(gè)改變狀態(tài)的promsie返回值,傳遞給p
看作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
摘要:的一些知識(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 : ...
摘要:和類在開始時(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í)性的概念,如:可組合性,可重用...
摘要:無論是靜態(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í)作...
閱讀 1945·2021-10-11 10:59
閱讀 1050·2021-09-07 09:59
閱讀 2247·2021-08-27 16:17
閱讀 2802·2019-08-30 15:54
閱讀 2287·2019-08-30 12:58
閱讀 1791·2019-08-30 12:53
閱讀 1483·2019-08-28 18:13
閱讀 743·2019-08-26 13:35