function f(shouldInitialize: boolean) {
if (shouldInitialize) {
var x = 10;
}
return x;
}
f(true); // returns '10'
f(false); // returns 'undefined'
此处的 x虽然在if语句中 但是也是在f函数中作为局部变量 为什么 false返回的是undefined呢 ?不是应该也返回10吗
function f(shouldInitialize: boolean) {
if (shouldInitialize) {
var x = 10;
}
return x;
}
f(true); // returns '10'
f(false); // returns 'undefined'
此处的 x虽然在if语句中 但是也是在f函数中作为局部变量 为什么 false返回的是undefined呢 ?不是应该也返回10吗
这是作用域的问题。
用了var关键字,变量作用域提升,true的时候,if外面可见x,false的时候不走这里,外面看不到。
你可以试下let或者const,即使你true,直接报错x没定义。
泻药,这个问题,var是函数作用域也就是function级别。{}限制不了它的域,存在变量提示。
也就是js解释器在解释的时候第一遍会遍历function里的变量做预声明,然后再按行解析。
这道题,程序进入函数后:
你可以对比下面两段代码
function f(shouldInitialize = true) {
console.log(x);
if (shouldInitialize) {
var x = 10;
}
return x;
}
f(false); // returns 'undefined'
function f(shouldInitialize = true) {
console.log(x);
if (shouldInitialize) {
let x = 10;
}
return x;
}
f(false); // let 作用域是块也就是{},解析阶段会报错
该说的楼上都说了,我只是翻译一下。
function f(shouldInitialize: boolean) {
var x;//这就是所谓的声明提升
if (shouldInitialize) {
x = 10;
}
return x;
}
f(true); // returns '10'
f(false); // returns 'undefined'
(1)传入参数为true
时,if
语句执行,存在变量提升情况。此时,f()
函数如下。
function f(shouldInitialize: boolean) {
var x; //变量提升
if (shouldInitialize) {
x = 10;
}
return x;
}
f(true); // returns '10'
(2)传入参数为false
时,if
语句对应的赋值语句没有执行,但依旧存在var
变量声明和变量提升。此时,f()
函数如下。
//传入参数为false时
function f(shouldInitialize: boolean) {
var x; //变量提升
return x;
}
f(false); // returns 'undefined'
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
非常感谢热心小伙伴的指点, 楼上说的变量提升就是这个意思吧 这应该就是程序走的步骤