Javascript-提升中的优先级
在提升过程中,变量优先于函数定义还是相反?请参阅下面的代码:Javascript-提升中的优先级,javascript,function,hoisting,Javascript,Function,Hoisting,在提升过程中,变量优先于函数定义还是相反?请参阅下面的代码: function a() { var x = 10; function x() { return 20; } return x; } 这不是一个优先于另一个的问题(有优先权发生,但这在很大程度上只是一个语义问题) 这里重要的是变量声明的赋值部分不被提升,而整个函数定义被提升 注意根据raina77ow的回答,我最初的部分假设似乎是错误的。函数在变量声明之前被提升,但最终效果是相同的
function a()
{
var x = 10;
function x() {
return 20;
}
return x;
}
这不是一个优先于另一个的问题(有优先权发生,但这在很大程度上只是一个语义问题) 这里重要的是变量声明的赋值部分不被提升,而整个函数定义被提升 注意根据raina77ow的回答,我最初的部分假设似乎是错误的。函数在变量声明之前被提升,但最终效果是相同的 提升后,您的功能将如下所示:
function a()
{
var x = function x() { // hoisted function declaration/definition
return 20;
};
var x; // hoisted variable declaration
x = 10; // unhoisted part of variable declaration
return x;
}
function a() {
function x() {
return 20;
}
var x = 10;
return x;
}
function a() {
var x = function x() { return 20; };
var x;
console.log(x);
x = 10;
console.log(x);
}
x=10
发生在所有提升完成后,因此该值保留在x
中。
为了响应@thefourtheye的请求(我认为这是他/她所要求的),如果您的原始功能如下所示:
function a()
{
var x = function x() { // hoisted function declaration/definition
return 20;
};
var x; // hoisted variable declaration
x = 10; // unhoisted part of variable declaration
return x;
}
function a() {
function x() {
return 20;
}
var x = 10;
return x;
}
function a() {
var x = function x() { return 20; };
var x;
console.log(x);
x = 10;
console.log(x);
}
然后吊装后,外观如下(同上):
作为最后一个示例,请尝试以下操作:
function a() {
console.log(x);
var x = 10;
console.log(x);
function x() { return 20; };
}
调用时,将打印出:
function x() { return 20; }
10
原因是起重导致功能表现如下:
function a()
{
var x = function x() { // hoisted function declaration/definition
return 20;
};
var x; // hoisted variable declaration
x = 10; // unhoisted part of variable declaration
return x;
}
function a() {
function x() {
return 20;
}
var x = 10;
return x;
}
function a() {
var x = function x() { return 20; };
var x;
console.log(x);
x = 10;
console.log(x);
}
您的代码将等于以下内容:
function a() {
var x;
function x() { // this function is assigned to variable indicator "x"
return 20;
}
x = 10; // this overrides the variable indicator "x"
return x;
}
因此,当您调用函数时:
a() // 10
请交换
var
和函数
,并对其进行推理。@thefour他们编辑了我的答案。这就是你想要的吗?我不确定我是否理解了您的请求。这并不是说变量在提升过程中优先
-那么,函数定义优先,对吗?@JLRishe-那么,函数定义将分解为函数运算符。但这种崩溃是像你说的那样发生的,还是会像VarX一样发生;x=函数x()@第四,不,两者都不一定优先。关键是变量声明和函数定义的表达方式不同。对于变量声明,只提升声明部分,而对于函数定义,提升整个函数。已经定义了x。它的代码很混乱,不需要修改。在代码回顾中,我会让程序员改变这一点。变量被提升到作用域的顶部,然后分配到调用它们的位置。在ECMAScript 5.1中,没有关于提升的讨论。因此,您不应该依赖于任何特定的实现。最佳实践是在作用域顶部声明变量,然后在声明后初始化。