当 JavaScript 变量名和函数名相同时会发生什么?

What happens when JavaScript variable name and function name is the same?

我有以下代码,我在其中声明了一个函数,然后是一个与函数同名的变量:

function a(x) {
    return x * 2;
}

var a;
alert(a);

我希望这会提醒 undefined,但如果我 运行 它,提醒将显示以下内容:

function a(x) {
    return x * 2
}

如果我为变量赋值(如 var a = 4),警报将显示该值 (4),但如果不进行此更改,a 将被识别为功能。

为什么会这样?

如果您将 function name 用作 variable name,其值将替换为 function body。所以 var a 变成了你的 function a 并且因此你的警报显示函数 a.

编辑 但是如果你给 a 赋值,比如 var a = "xya";。然后 function 将被 variable 替换。根据 Order of precedence

  1. 变量赋值优先于函数声明
  2. 函数声明优先于变量声明

在JavaScript中,函数声明变量声明都提升到函数的顶部,如果在函数,或者全局上下文的顶部,如果在函数之外。并且函数声明优先于变量声明(但不高于变量赋值)。

提升时函数声明覆盖变量声明

首先声明一个变量:

var a; // value of a is undefined 

其次,a的值是一个函数,因为函数声明优先于变量声明(但不高于变量赋值):

function a(x) {
  return x * 2;
}

这就是您调用 alert(a); 时得到的结果。

但是,如果您不声明变量而进行变量赋值:var a = 4;,则赋值 4 将优先。

你还应该记得 var a 被吊起来了,这使得它更像这样

var a; // placed

function a(x) {
  return x * 2;
};

var a; // removed
alert (a); // a is replaced by function body

记住 var a 被提升了,所以如果你分配 4 to a:

var a; // placed

function a(x) {
  return x * 2;
};

var a = 4; // removed
a = 4 // added

alert (a); // a is now 4

函数对象的一种,是的一种。

值可以存储在变量(和属性中,并作为参数传递给函数等)。

函数声明:

  • 创建命名函数
  • 在当前范围内创建一个与函数同名的变量(除非这样的变量已经存在)
  • 将函数分配给该变量
  • 已挂起

一条var语句:

  • 在当前范围内创建一个具有指定名称的变量(除非这样的变量已经存在)
  • 已挂起
  • 不为该变量赋值(除非结合赋值运算符)

您的声明和 var 声明都已提升。其中只有一个给变量赋值a.

ES6 通过在使用 let / const 而不是 var.

时定义 SyntaxError: Identifier (?) has already been declared 来提供更好的解决方案

let

function foo () {}
let foo;
// => SyntaxError: Identifier 'foo' has already been declared

const

function foo () {}
const foo = 1;
// => SyntaxError: Identifier 'foo' has already been declared

请注意,const foo; 不起作用。会导致SyntaxError: Missing initializer in const declaration