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