25

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

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

var a;
alert(a);

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

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

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

为什么会这样?

4

5 回答 5

24

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

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

函数声明:

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

var声明:

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

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

于 2016-11-18T11:27:31.867 回答
13

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

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

首先声明一个变量:

var a; // value of a is undefined 

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

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

这就是你打电话时得到的alert(a);

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

于 2016-11-18T11:25:18.143 回答
4

如果您使用function nameas variable name,则其值将替换为function body。因此var a成为您的function a,因此您的警报显示功能a

编辑但是,如果您将值分配给alike var a = "xya";。然后它将function被替换variable。按优先顺序

  1. 变量赋值优先于函数声明
  2. 函数声明优先于变量声明
于 2016-11-18T11:24:19.180 回答
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
于 2016-11-18T11:26:46.270 回答
-1

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

于 2019-07-10T18:52:01.733 回答