簡體   English   中英

console.log()在控制台以外的對象上調用

[英]console.log() called on object other than console

我記得,當我想將console.log作為回調參數傳遞給某個函數時,除非我使用bind()方法將console綁定到它,否則它不起作用。

例如:

const callWithTest = callback => callback('test');
callWithTest(console.log); // That didn't use to work.
callWithTest(console.log.bind(console)); // That worked (and works) fine.

請參閱未捕獲的TypeError:javascript中的非法調用

但是,最近我注意到console.log()即使在除了控制台之外的對象上調用時也能正常工作。 例如:

console.log.call(null, 'test');

記錄'test'

它何時以及為何會改變? 規范是否說明了什么?

編輯器的Console API草案曾經說過:

記錄API應該都是可調用的函數,允許它們作為參數傳遞給錯誤處理回調,forEach方法等。

這不再包含在當前版本的規范中

我認為Chrome和Node.js將其改變為在規范中工作,但它似乎在它之前就像它一樣工作。

我還好奇它什么時候改變了,原因是什么。

我不知道改變的時間,但我知道為什么它不起作用。

請考慮以下代碼

callWithTest = callback => callback('test');
var Demo = function () {this.str = 'demo';}
Demo.prototype.getStr = function () { return this.str;}
demo = new Demo ();
demo.getStr(); // returns 'demo'
callWithTest(demo.getStr); // returns undefined
window.str = 'window';
callWithTest(demo.getStr); // returns 'window'

如果你跟蹤代碼,你會看到當通過另一個函數調用demo.getStr時, this引用了window ,而sine str沒有在window定義,它返回undefined 如果你直接把它叫做或演示綁定, this指的是演示,所以返回“演示”。

在nodeJS(v6.6.0)中,控制台模塊中存在一個名為Console的類,用戶可以將日志顯式地管理到文件(或用戶喜歡的任何流)。 根據Node.js v6.6.0 api規范,

console = new Console(process.stdout, process.stderr);

瀏覽器中不存在Console ,因為它不是必需的。 控制台的輸出僅存在於用於調試的畫布中,並且只有一個實例。 用戶不能也不應該將控制台的輸出管道傳輸到任何其他地方,因為它將成為一個嚴重的安全問題。 因此,開發人員可以在日志函數中執行某些操作,例如var x = this.x || console.x var x = this.x || console.x因為只有一個控制台對象的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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