2013-09-30 63 views
2

我知道yield*可以用來組成generator,這樣使用V8 JavaScript,普通函數可能產生一個值嗎?

function* foo() { 
     yield* bar(); 
     yield 1; 
} 
function* bar() { 
     yield 2; 
} 

但是,如果我有一些正常功能yield的值。

function xx() 
    { 
     yield 1; 
    } 

V8說

yield 1; 
     ^
    SyntaxError: Unexpected number` 

這是否意味着yield只節省了generator的環境,而不是完整的調用堆棧,有沒有辦法停止和恢復像發電機正常的功能?

我聽說在FireFox(SpiderMonkey)中,yield可以用於與ES6不兼容的正常功能。

回答

3

是的,yield僅適用於發電機。發電機在ES6中標記爲*,早期的SpiderMonkey實施早於ES6草案,情況並非如此。這就是爲什麼你可以在SpiderMonkey的「正常」功能中使用yield - 這實際上並不正常,但實際上是一個發生器。

IOW,在任一情況下,yield屬於發電機。它總是產生一個淺的一次延續(但你可以用yield*明確委託)。

+0

謝謝安德烈亞斯。我接受你的答案。我想知道爲什麼ES6不接受更強大的'SpiderMonkey yield'。甚至更加強大的「計劃」中的第一類延續。我們可以基於'continuation'或'SpiderMonkey yield'輕鬆構建'V8 yield'。但反過來很難做到這一點。 – wcy

+1

因爲我們發現最好能夠在代碼中直接明確函數和生成器之間的區別,而不必搜索整個身體發生「yield」。他們真是完全不同的野獸,稱它們具有完全不同的含義。全面的繼續OTOH被委員會一致拒絕,因爲它們強大並且破壞網絡上現有代碼可能承擔的各種不變量,因此存在安全風險等問題。 –

+0

另請注意,SpiderMonkey的良率不會更強大,它只是更微妙的語法。 –

相關問題