簡體   English   中英

為什么你不能做[array] .forEach(console.log)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM