![](/img/trans.png)
[英]Why does the fat-arrow not bind to the current environment in loop comprehensions?
[英]forEach loop on array with fat arrow
我想逐行打印一個數組與回車。
簡單的實現是[1,2,3].forEach(function(x) {console.log(x)})
將此作為輸出
1
2
3
現在,如果我使用ES6胖箭的語法糖,
michel$ node
> [1,2,3].forEach(x => console.log(x))
1
2
3
undefined
>
> [1,2,3].forEach(console.log)
1 0 [ 1, 2, 3 ]
2 1 [ 1, 2, 3 ]
3 2 [ 1, 2, 3 ]
undefined
省略forEach
回調中的函數參數時,看起來第二個版本正在返回自身的笛卡爾積。
在像Scala這樣的其他函數式語言中,這是完全可以的,為什么JavaScript中的這個“錯誤”呢?
michel$ scala
scala> Array(1,2,3).foreach(x => println(x))
1
2
3
scala> Array(1,2,3).foreach(println)
1
2
3
看來這段代碼在這里:
[1,2,3].forEach(console.log)
是相同的:
[1,2,3].forEach((value, index, array) => console.log(value, index, array))
它不是“錯誤的”,與Scala或Java(方法引用)相比,它只是“不尋常”,它似乎支持使用一個參數的方法引用。 Javascript似乎只是將所有參數復制到引用的方法(例如console.log
),如果此方法支持varargs,則所有內容都會被處理。
但如果您不喜歡這種行為,可以在Javascript中修復它。 創建一個接受一個參數的簡單函數:
function print(t) { console.log(t) }
然后執行:
[1,2,3].forEach(print)
這會打印出結果,如果您來自Scala背景,這將讓您有賓至如歸的感覺:
1
2
3
您可以像這樣使用ES6'胖'箭頭。
const data = [1,2,3,4]
data.forEach(item => {
console.log(item)
})
forEach
將多個參數傳遞給回調,而不只是一個:項目,索引和調用forEach
的對象。 console.log
大多數實現接受多個參數並輸出所有參數。 這就是為什么forEach(console.log)
輸出條目( 1
),它的索引( 0
)和數組( [ 1, 2, 3 ]
),然后是下一個,等等。
使用箭頭功能,您只使用第一個參數。
附注: forEach(console.log)
也傳入console.log
不保證this
在通話過程中log
將console
。 有些控制台實現並不關心,有些則不關心。 因此,如果您想要第二種形式,那么使用forEach(console.log, console)
可能會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.