我有以下代码,我在其中声明了一个函数,然后是一个与函数同名的变量:
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 nameas variable name,则其值将替换为function body。所以var a变成你的function a,从而你的警报显示功能a。
编辑但是如果你给alike赋值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