function
*foo()
let generator =
foo();
// 返回迭代器例項(指標物件)
console.
log(generator.
next
('111'))
;//console.
log(generator.
next
('aaaa'))
;//
console.
log(generator.
next()
);// console.
log(generator.
next()
);//
hi!定義generator函式,只需在function 與 方法名之間加個*。yield後面只能接表示式或函式呼叫語句aaaa
呼叫foo後,只會返回乙個指標物件,不會執行裡面的**
呼叫第乙個next()時,**從函式第一行執行,直到遇到yield命令,把yield裡面的語句執行完,**停止,next()呼叫完後返回乙個物件,value是yield表示式的返回結果,第一yield後面只有乙個 『hello』 字串,其實相當於返回 『hello』(跟箭頭函式差不多)
我們呼叫第
一、第二個next方法的時候,都傳入了乙個引數,但是第一next(『111』)沒有起作用,而第二個next(『aaa』),最後console.log(a)中有輸出。這是因為next()傳參的原因。當我們呼叫第二個next()時,generator裡面的**上一次執行完後停止在了第乙個yield一行,這是執行第二個next的起點,這時第二next()傳入的』aaa』,就會被let a = yield … 這一行的變數 a 接收。同樣,第二次執行**會在遇到第二個yield,並執行完其後面的語句後再次停止。但是呼叫的next()返回物件中value=undefined,這是因為conslog.log(a) 執行完後輸出了』aaa』,函式不能顯式設定返回值,就會返回undefined
第3次呼叫next(),會使函式裡面的**繼續從上一次結束的點開始再次執行,發現最後沒有了yield,那就會執行到底。整個函式所有**執行完畢,這時next()返回值為,value是函式最後的返回值,done表示函式所有**執行完畢。如果函式沒有返回值,value=undefined.
第4次呼叫next(),函式已經執行完了,還呼叫就會返回.第5第6次呼叫還是同樣的值,這是迭代器的特性。
generator是惰性求值的,如果你呼叫next()方法就不會執行函式裡面的**
yield有點類似於**除錯裡的斷點,在多個yield之間,每呼叫一次next()就執行一段**。
next()引數會把引數傳到上一次結束yield位置,如果有值接收,就把值傳為它。由於第一次呼叫,沒有上一次的說法,所以第一呼叫next()不能傳參,如果要傳,只能從呼叫generator函式時傳入。
gennerator就是返回乙個迭代器物件,跟使用iterator物件差不多。
乙個例子理解C 位移
來自 很多人覺得位移這東西很複雜,二進位制一堆0 1看不懂。其實很簡單。位移理解可能簡單一些 其實位移就是資料轉換成二進位制的左右移動 右移左補0,左移右補0,後面多出來的部分去掉。用乘除法去理解位移也可以 左位移 相當於乘 左移1位相當於乘2,左移2位相當於乘4,左移3位相當於乘8,左移4位相當於...
乙個例子理解C 位移
很多人提問,不知道c 位移,可能有些人在面試中也遇到過 其實很簡單。c 位移運算子 左移 右移 位移理解可能簡單一些 其實 就是資料轉換成二進位制的左右移動 右移左補0,左移右補0,後面多出來的部分去掉。用乘除法去理解位移也可以 左位移 相當於乘 左移1位相當於乘2,左移2位相當於乘4,左移3位相當...
乙個例子讓你清楚的理解同步,非同步,阻塞,非阻塞
同步阻塞 同步非阻塞 非同步阻塞 非同步非阻塞 出場人物 小明,水壺2個 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 1.小明把水壺放到火上,然後在那傻等水開。同步阻塞 小明覺得自己有點傻。2.小明把水壺放到火上,然後去客廳看電視,時不時的去廚房看看水開沒有。同步非阻塞 小明還是覺得自己有點傻,於是...