Javascript 使用var重新声明对象
我试图理解下面的代码中发生了什么,有人能帮忙吗?我正在使用node.js,并试图覆盖本机控制台(以执行其他操作) 这很好:Javascript 使用var重新声明对象,javascript,node.js,Javascript,Node.js,我试图理解下面的代码中发生了什么,有人能帮忙吗?我正在使用node.js,并试图覆盖本机控制台(以执行其他操作) 这很好: var output = console; console = {a: 2}; output.log(console) 但这并不是: var output = console; var console = {a: 2}; output.log(console) 我得到“无法调用未定义的方法‘log’” output=null,因为在引擎执行函数(或全局上下文)的代码
var output = console;
console = {a: 2};
output.log(console)
但这并不是:
var output = console;
var console = {a: 2};
output.log(console)
我得到“无法调用未定义的方法‘log’”
output=null,因为在引擎执行函数(或全局上下文)的代码之前,在它之后声明console,它会查找所有变量声明,并使用值
未定义的定义变量。这也叫变量提升
因此,以下代码:
var output = console;
var console = {a: 2};
output.log(console)
相当于:
var output;
var console;
output = console;
console = {a: 2};
output.log(console)
在output=控制台的行中
,控制台
仍有值未定义
注意:只有在模块或全局范围以外的任何范围内执行代码时,才会发生这种情况。在全局范围内,var控制台代码>声明将被忽略,因为控制台
已在全局范围中定义
如果要创建本地console
变量并引用全局console
对象,则必须通过全局对象引用它,该对象在Node.js中为global
,在浏览器中为window
。例如:
var output = global.console;
var console = {a: 2};
output.log(console)
在Chrome为我工作。为什么要覆盖本机控制台
?我想让它与标准cmd中的节点一起工作。我想覆盖它以添加颜色。例如console.info-将以蓝色打印。那么为什么不覆盖console.info
以以蓝色打印呢console.prototype.info=function(){/*您的自定义代码*/}
@KevinJantzer我认为您是对的,您的解决方案会更好。@AdrianBaran:它必须是Object.getPrototypeOf(global.console).info=…
。但是,这不一定要起作用,因为console
是一个主机对象,可以在环境认为合适的情况下构造;var输出前=控制台;它应该可以正常工作。好的,但是当行var output=console时;第一次访问时,为什么不使用本机控制台对象?“如果使用var console={a:2};在var output=console之前;它应该可以正常工作。”否,因为该对象没有log
方法。此回答不正确<代码>输出
永远不会为空
(最多未定义)!谢谢你知道为什么这个node-e'var x=console,console;x、 log(1)
正确地打印“1”,而节点-e'(function(){var x=console,console;x.log(1);})()代码>抛出类型错误@FelixKling@RobW:第一个实际在全局范围内执行(因为它是REPL),其中已定义了console
,并且var…,console代码>被忽略(console.log(global.x)
works)。我在回答中加了一段关于这一点的话。
var output = global.console;
var console = {a: 2};
output.log(console)