Node.js中变量重定义场景下console.log输出为何存在差异?
为什么两种执行结果不同?
这背后的核心是Node.js模块作用域和全局eval的行为在搞鬼,咱们一步步拆解:
先搞懂(1,eval)是什么
逗号运算符(1,eval)会返回最后一个表达式的值——也就是全局的eval函数。和直接写eval不同,全局eval会在全局作用域里执行传入的代码,而不是当前的词法作用域(比如Node模块的函数作用域)。
第一种情况:保留第一行var parameters = {}
- 第一行
var parameters = {}在Node模块的局部作用域里声明并初始化了parameters变量。 - 第二行
(1,eval)("var parameters = {a:1}"):全局eval在全局作用域里声明了另一个parameters变量,赋值为{a:1}。这时候存在两个parameters:一个在模块局部,一个在全局。 - 第三行
(1,eval)(console.log(parameters)):这里要注意,console.log(parameters)是先执行的,作为参数传给eval。此时JavaScript会优先取当前作用域(模块局部)的parameters,也就是最初的{},所以输出{}。之后eval执行的是console.log的返回值undefined,这一步没实际影响。
第二种情况:注释掉第一行
- 第二行的全局eval依然在全局作用域声明并赋值了
parameters = {a:1}。 - 第三行
console.log(parameters)执行时,模块局部作用域没有parameters变量,所以JavaScript会向上查找全局作用域,找到那个{a:1},自然就输出{ a: 1 }。
简单说就是:第一种情况里,console.log访问的是模块局部的parameters,第二种情况访问的是全局的parameters,所以结果不一样。
内容的提问来源于stack exchange,提问作者Angelo Borsotti
相关产品推荐
相关产品推荐

