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

IT技术 javascript function scope hoisting name-binding
2021-02-15 08:31:11

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

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

var a;
alert(a);

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

函数 a(x) {
    返回 x * 2
}

如果我为变量赋值(如var a = 4),警报将显示该值 ( 4),但如果没有此更改,a则将被识别为函数。

为什么会这样?

5个回答

函数是一种对象类型,它是一种类型

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

一个函数声明:

  • 创建命名函数
  • 在当前作用域中创建一个与函数同名的变量(除非这样的变量已经存在)
  • 将函数分配给该变量
  • 被吊起

一个var语句:

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

你的声明和var声明都被提升了。其中只有一个为变量赋值a

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

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

首先声明一个变量:

var a; // value of a is undefined 

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

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

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

但是,如果您不是声明变量而是进行变量赋值:var a = 4;那么分配的值4将占上风。

是的@Quentin 但表达式不是或命名表达式
2021-04-22 08:31:11
是的@Quentin:函数声明和变量声明都被提升到包含范围的顶部。并且函数声明优先于变量声明(但不高于变量赋值)。
2021-04-23 08:31:11
函数声明也被提升。
2021-05-08 08:31:11

如果使用function nameas variable name,则其值将替换为function body所以var a变成你的function a,从而你的警报显示功能a

编辑但是如果你给alike赋值var a = "xya";然后它将function被替换variable优先顺序

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

你还应该记住它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

ES6 通过定义SyntaxError: Identifier (?) has already been declared何时使用let/const而不是var.

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