我有以下代码,我在其中声明了一个函数,然后声明了一个与函数同名的变量:
function a(x) {
return x * 2;
}
var a;
alert(a);
我希望这会 alert undefined
,但如果我运行它,警报将显示以下内容:
函数 a(x) {
返回 x * 2
}
如果我为变量赋值(如var a = 4
),警报将显示该值(4
),但如果没有此更改,a
将被识别为函数。
为什么会这样?
我有以下代码,我在其中声明了一个函数,然后声明了一个与函数同名的变量:
function a(x) {
return x * 2;
}
var a;
alert(a);
我希望这会 alert undefined
,但如果我运行它,警报将显示以下内容:
函数 a(x) {
返回 x * 2
}
如果我为变量赋值(如var a = 4
),警报将显示该值(4
),但如果没有此更改,a
将被识别为函数。
为什么会这样?
函数是一种类型的对象,它是一种类型的值。
值可以存储在变量(和属性,并作为参数传递给函数等)。
函数声明:
var
声明:
你的声明和var
声明都被提升了。其中只有一个为变量赋值a
。
在 JavaScript 中,函数声明和变量声明都被提升到函数的顶部,如果定义在函数中,或者全局上下文的顶部,如果在函数之外。并且函数声明优先于变量声明(但不高于变量赋值)。
函数声明在提升时覆盖变量声明
首先声明一个变量:
var a; // value of a is undefined
其次, 的值a
是一个函数,因为函数声明优先于变量声明(但不高于变量赋值):
function a(x) {
return x * 2;
}
这就是你打电话时得到的alert(a);
。
但是,如果不是声明一个变量,而是进行变量赋值:var a = 4;
那么分配的值4
将占上风。
如果您使用function name
as variable name
,则其值将替换为function body
。因此var a
成为您的function a
,因此您的警报显示功能a
。
编辑但是,如果您将值分配给a
like var a = "xya";
。然后它将function
被替换variable
。按优先顺序
您还应该记住,它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