在提升中,变量优先于函数定义还是反过来?请参阅以下代码:
function a()
{
var x = 10;
function x() {
return 20;
}
return x;
}
答案 0 :(得分:2)
这不是一个优先于另一个的问题(优先发生,但这主要只是语义问题)。
这里重要的是变量声明的赋值部分不悬挂,而整个函数定义是。
注意根据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;
}
x = 10
在所有提升完成后发生,因此这是x
中保留的值。
function a() {
function x() {
return 20;
}
var x = 10;
return x;
}
然后在提升后,它看起来像这样(与上面相同):
function a() {
var x = function x() { // hoisted function declaration/definition
return 20;
}
var x; // hoisted variable declaration (does nothing)
x = 10; // unhoisted variable assignment
return 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() { return 20; };
var x;
console.log(x);
x = 10;
console.log(x);
}
答案 1 :(得分:1)
您的代码将等于以下内容:
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