如何最安全地使用console.log和console.warn?

Eva*_*oll 5 javascript cross-platform cross-browser ecmascript-5 console.log

我正在努力接管一个代码库,该代码库进行测试以确保console.warn存在,如下所示:

if (window.console) {                                                                                                                                                                                                                                                      
  console.warn("shhaabang");                                                                                                                                                                                                    
}                                                                                                                                                                                                                                                                          
Run Code Online (Sandbox Code Playgroud)

但是,我的问题是它仅在具有窗口对象的浏览器中有效。这似乎也有效。

if (console && typeof console.warn == 'function') {                                                                                                                                                                                                                                                      
  console.warn("shhaabang");                                                                                                                                                                                                    
}
Run Code Online (Sandbox Code Playgroud)

这种方法有什么缺点吗?有没有更好的方法不假设 的存在window?我应该先查看窗口或全局是否存在并检查两者吗?

澄清至少应该很明显的是,我正在没有该window对象的东西中测试它。但是,明确地说,我在 node.js 以及浏览器中运行它

mld*_*mld 0

你不应该这样做

if(console && typeof console.warn == "function"){ ... }
Run Code Online (Sandbox Code Playgroud)

因为如果未定义控制台,这会引发错误

您可以使用this

例如:

if(this.console){
  console.warn("shhaabang");
}
Run Code Online (Sandbox Code Playgroud)

编辑:哦,抱歉,我刚刚注意到两件事:1)这只有在this没有更改的情况下才有效...谢谢@Evan Carroll 2)这在 中不起作用strict mode,因为在strict mode,this中undefined

所以这是另一种方法:

var c;
try {
  c = console;
} catch(e){ 
  // console is not defined
}

if(c) {
  // console is defined
}else{
  // this will not throw because you declared `c` earlier
}
Run Code Online (Sandbox Code Playgroud)