我有以下代码,我在其中声明了一个函数,然后是一个与函数同名的变量:
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