当 JavaScript 变量名和函数名相同时会发生什么?
What happens when JavaScript variable name and function name is the same?
我有以下代码,我在其中声明了一个函数,然后是一个与函数同名的变量:
function a(x) {
return x * 2;
}
var a;
alert(a);
我希望这会提醒 undefined
,但如果我 运行 它,提醒将显示以下内容:
function a(x) {
return x * 2
}
如果我为变量赋值(如 var a = 4
),警报将显示该值 (4
),但如果不进行此更改,a
将被识别为功能。
为什么会这样?
如果您将 function name
用作 variable name
,其值将替换为 function body
。所以 var a
变成了你的 function a
并且因此你的警报显示函数 a
.
编辑 但是如果你给 a
赋值,比如 var a = "xya";
。然后 function
将被 variable
替换。根据 Order of precedence
- 变量赋值优先于函数声明
- 函数声明优先于变量声明
在JavaScript中,函数声明和变量声明都提升到函数的顶部,如果在函数,或者全局上下文的顶部,如果在函数之外。并且函数声明优先于变量声明(但不高于变量赋值)。
提升时函数声明覆盖变量声明
首先声明一个变量:
var a; // value of a is undefined
其次,a
的值是一个函数,因为函数声明优先于变量声明(但不高于变量赋值):
function a(x) {
return x * 2;
}
这就是您调用 alert(a);
时得到的结果。
但是,如果您不声明变量而进行变量赋值:var a = 4;
,则赋值 4
将优先。
你还应该记得 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
函数是对象的一种,是值的一种。
值可以存储在变量(和属性中,并作为参数传递给函数等)。
函数声明:
- 创建命名函数
- 在当前范围内创建一个与函数同名的变量(除非这样的变量已经存在)
- 将函数分配给该变量
- 已挂起
一条var
语句:
- 在当前范围内创建一个具有指定名称的变量(除非这样的变量已经存在)
- 已挂起
- 不为该变量赋值(除非结合赋值运算符)
您的声明和 var
声明都已提升。其中只有一个给变量赋值a
.
ES6 通过在使用 let
/ const
而不是 var
.
时定义 SyntaxError: Identifier (?) has already been declared
来提供更好的解决方案
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
我有以下代码,我在其中声明了一个函数,然后是一个与函数同名的变量:
function a(x) {
return x * 2;
}
var a;
alert(a);
我希望这会提醒 undefined
,但如果我 运行 它,提醒将显示以下内容:
function a(x) {
return x * 2
}
如果我为变量赋值(如 var a = 4
),警报将显示该值 (4
),但如果不进行此更改,a
将被识别为功能。
为什么会这样?
如果您将 function name
用作 variable name
,其值将替换为 function body
。所以 var a
变成了你的 function a
并且因此你的警报显示函数 a
.
编辑 但是如果你给 a
赋值,比如 var a = "xya";
。然后 function
将被 variable
替换。根据 Order of precedence
- 变量赋值优先于函数声明
- 函数声明优先于变量声明
在JavaScript中,函数声明和变量声明都提升到函数的顶部,如果在函数,或者全局上下文的顶部,如果在函数之外。并且函数声明优先于变量声明(但不高于变量赋值)。
提升时函数声明覆盖变量声明
首先声明一个变量:
var a; // value of a is undefined
其次,a
的值是一个函数,因为函数声明优先于变量声明(但不高于变量赋值):
function a(x) {
return x * 2;
}
这就是您调用 alert(a);
时得到的结果。
但是,如果您不声明变量而进行变量赋值:var a = 4;
,则赋值 4
将优先。
你还应该记得 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
函数是对象的一种,是值的一种。
值可以存储在变量(和属性中,并作为参数传递给函数等)。
函数声明:
- 创建命名函数
- 在当前范围内创建一个与函数同名的变量(除非这样的变量已经存在)
- 将函数分配给该变量
- 已挂起
一条var
语句:
- 在当前范围内创建一个具有指定名称的变量(除非这样的变量已经存在)
- 已挂起
- 不为该变量赋值(除非结合赋值运算符)
您的声明和 var
声明都已提升。其中只有一个给变量赋值a
.
ES6 通过在使用 let
/ const
而不是 var
.
SyntaxError: Identifier (?) has already been declared
来提供更好的解决方案
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