Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用var重新声明对象_Javascript_Node.js - Fatal编程技术网

Javascript 使用var重新声明对象

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,因为在引擎执行函数(或全局上下文)的代码

我试图理解下面的代码中发生了什么,有人能帮忙吗?我正在使用node.js,并试图覆盖本机控制台(以执行其他操作)

这很好:

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)