重新定义变量不成功

Posted

技术标签:

【中文标题】重新定义变量不成功【英文标题】:Redefined variable not success 【发布时间】:2016-04-15 06:47:35 【问题描述】:

对于下面的代码,因为我已经用var a 重新声明了a,所以我对alert(a) 的期望是显示undefined,但为什么它显示4

function f(a) 
  var a;
  alert(a);


f(4);

【问题讨论】:

jslint 或其他 linter 会报错如“Redefinition of a:, 另外,如果你使用let而不是var,解释器(或转译器)本身会产生一个有用的错误。 你的标题很误导人,你没有在这里重新定义变量 【参考方案1】:

javascript 中,变量要么是全局的,要么是函数的局部。函数内没有嵌套作用域之类的东西(除非您实际上将一个函数嵌套在另一个函数中)。

引用 Mozilla 的 JavaScript 文档:

The scope of a variable declared with var is its current execution context, which is either the enclosing function or, for variables declared outside any function, global.

由于函数参数a 和您的var a 都在同一个函数范围内声明,因此它们解析为同一个变量。

另见:What is the scope of variables in JavaScript?


请注意,对象字段也可以被视为另一级别的范围界定——但这与您的问题并不真正相关。

另外——正如 torazaburo 在他下面的评论中指出的——ECMAScript 6 introduced a let keyword,它可以让你在函数中创建真正的嵌套作用域。然而,这个特性足够新,我最初并不认为它值得一提(因为在生产代码中使用它还不是很安全)。例如,它看起来像 Firefox won't officially support the new let construct until their new release at the end of this month (January 2016)。

【讨论】:

函数中没有嵌套作用域这种东西但是let呢? @torazaburo - 好点。但是,由于 let 去年才刚刚标准化,因此在没有 jumping through hoops 的情况下在野外真正安全使用可能还需要一段时间。【参考方案2】:

声明在称为提升的过程中移至其范围的顶部。

例如:

var a = 5;
var a = 6;
var a;

变成类似

var a = undefined;
a = 5;
a = 6;
a;

因此,尝试在不使用任何赋值的情况下重新声明一个已声明的变量没有任何作用。

在您的情况下,变量 a 已被声明为函数的参数。所以var a; 没用。如果要将其设置为未定义,请使用a = void 0;

【讨论】:

我不明白--这里的吊装有什么意义? @torazaburo 当一个变量用var a; 声明时,它的值将是未定义的。但是由于提升,声明被移到顶部,因此无法重新声明变量。至少我是这么理解的。

以上是关于重新定义变量不成功的主要内容,如果未能解决你的问题,请参考以下文章

R:dplyr条件汇总并按列重新编码值

子状态更改时子不重新渲染

如何重新定义 glm 矩阵变量或删除其变换?

如何定义变量或稍后在代码中重新计算?

重新定义派生类的变量

在wincc中,我已经定义了结构体变量(有浮点型,整型,字符,文本类),c脚本中取值时需要再重新定