JS 中 console.log 的问题。

2015-05-05 21:27:42 +08:00
 haozhang

今天突然想到用个变量去指向console.log于是:
var log = console.log;
log(1);

但是出现了如下错误:
Uncaught TypeError: Illegal invocation

是浏览器的内置console.log不能手动的指向她?

6984 次点击
所在节点    JavaScript
16 条回复
soulteary
2015-05-05 21:30:56 +08:00
顺手答,不谢: https://github.com/soulteary/debug.js

当然,你也可以简单的定义window.console = window.console || {log:function(){...}, ...}
haozhang
2015-05-05 21:33:26 +08:00
@soulteary 可是这样子干的话。。console出来的line number是自定义的log函数的地方而不是使用log函数的地方。。。看起来有点累。
tonyluj
2015-05-05 21:33:51 +08:00
这样也好:
var log = function(msg) { console.log(msg); }
haozhang
2015-05-05 21:34:42 +08:00
@soulteary 而且window.console = window.console这是在干嘛...
haozhang
2015-05-05 21:35:56 +08:00
@tonyluj 一开始我是这么干的...但是console出来的代码line number是定义这个log函数的line number而不是调用log函数的地方,看console信息非常难受,不能第一时间看到出错的地方
tonyluj
2015-05-05 21:39:27 +08:00
ibigbug
2015-05-05 21:51:13 +08:00
```
var log = console.log.bind(console)
log(123)
```

这样就好了呀
haozhang
2015-05-05 22:02:23 +08:00
@ibigbug 正解啊,像我那样调用的话scope是window而不是console了。
haozhang
2015-05-05 22:17:41 +08:00
@ibigbug 不是scope而是this...,多谢了。
haozhang
2015-05-05 22:22:49 +08:00
@tonyluj XD,看7L的解决办法,一个字6。
tonyluj
2015-05-05 22:25:28 +08:00
@haozhang 我自己之前封装log的时候,还需要加一些其他业务逻辑,不方便之处就是行号显示不对。这样的话貌似只是改了个名字~
magicdawn
2015-05-05 22:36:17 +08:00
log = console.log

然后调用不对,可能内部实现,是依赖this值的,log单独调用时this指向不对...

在node上就没有这个问题,console.log.toString() 显示的是native code
haozhang
2015-05-05 22:37:48 +08:00
@tonyluj 对啊,要用lineNumber的话必须是Error,但我只是想log一下而已..
haozhang
2015-05-05 22:38:39 +08:00
@magicdawn 对的,内部的this本来是指向console的,我直接在全局调用的话,this就是window了,所以出错了。
otakustay
2015-05-06 11:30:31 +08:00
同样的
var g = document.getElementById;
g('foo');
也是不行的
ibigbug
2015-05-06 23:23:21 +08:00
@haozhang this 还是 console,因为 bind 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/188724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX