您好我有一段代码。当我删除相同代码的非相关部分时,我对值x1的更改感到困惑。我搜索了一下,我发现它与吊装有关。但即使对我来说,提升概念的价值仍然不明确。有人可以告诉我这个吗?
var x = 10;
function main() {
document.write("<br>x1 is " + x);
x = 20;
if (x > 0) {
var x = 30;
document.write("<br>x2 is " + x);
}
var x = 40;
var f = function(x) {
document.write("<br>x3 is " + x);
}
f(50);
}
main();
此代码的输出为:
x1未定义
x2是30
x3是50
如果我将此代码更改为:
var x = 10;
function main() {
document.write("<br>x1 is " + x);
}
main();
输出结果为:
x1是10
答案 0 :(得分:2)
所以这里发生的事情是一个常见的陷阱。
最简单的方法是。在var x = 30
函数中设置main
时,实际上是在重新定义var x = 10
在此函数中使用的范围。这与Javascript的执行方式和范围有关。
通过在函数内定义x
,x的范围已更改。下面是我的意思的示例和适用的代码版本
示例:强>
var test = 'test';
function run(){
console.log(test);
var test=1;
}
您的代码已更新:
var x = 10;
function main() {
console.log("<br>x1 is " + x);
x = 20;
if (x > 0) {
x = 30;
console.log("<br>x2 is " + x);
}
x = 40;
var f = function(x) { console.log("<br>x3 is " + x); }
f(50);
}
main();
好问题btw。
由于这是Javascript执行方式的一个非常有趣的范围,请考虑以下代码及其输出以获得完整的想法
var test = 'test';
function run(){
console.log(test);
test=1;
console.log(test);
var test=2;
console.log(test);
}
console.log(test);
run();
console.log(test);
非常有趣,看看这是如何反应的。
答案 1 :(得分:1)
所有变量和函数声明都被提升了#34;或者移到他们的范围的顶部。导致undefined
的{{1}}值是因为x
语句被移动到var x
的顶部,但作业main
没有。
因此,您的代码将更像这样:
= 30
您可以在此处详细了解吊装:JavaScript Scoping and Hoisting