[英]Why doesn't my React component renders what I want in a foreach, but will console.log the array?
[英]why can't you do [array].forEach(console.log)
回到暫時寫javascript,我想知道為什么這是不可能的
[array].forEach(console.log)
因為console.log.bind(console)
,否則使用錯誤的上下文調用console
對象的.log()
方法。
遵循的一般規則是:必須使用適當的上下文調用該方法,除非另有說明。
因此,在這種特殊情況下,沒有人聲明它可以用undefined
來調用,所以你不應該期望它能夠工作。 即使它確實如此 - 你也不應該依賴它。
它可以在某些瀏覽器中正常工作,而不是在其他瀏
Javascript中的一個主要問題是this
行為方式。 通常這些會產生截然不同的行為:
myObj.method();
var a = myObj.method;
a();
你正在做的是將console.log
作為函數傳遞給forEach
,它將它與它所附加的對象分開。 這將導致的任何使用this
里面log
方法來指代錯誤的事情,並很可能導致該方法無法正常工作。
要解決此問題,您可以將thisArg
傳遞給.forEach
:
[array].forEach(console.log, console);
或者使用.bind()
:
[array].forEach(console.log.bind(console));
如果瀏覽器支持它,你可以,盡管如此,你不應該依賴它。
它在某些瀏覽器上不起作用的原因是傳遞這樣的函數引用(即使該函數是對象(如console
)的屬性)也不會在該函數中正確設置this
上下文。
當log
函數的(特定於瀏覽器)實現嘗試訪問其this
變量時,它發現它實際上引用了全局對象,而不是引用console
。
要修復它,您可以使用:
[array].forEach(console.log.bind(console));
其中.bind
調用返回一個包含原始函數的新函數,其上下文設置為傳遞的參數(例如console
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.