js 局部变量和全局变量

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吗

阅读 5.2k
11 个回答
function f(params){
        var x;
        if(params){
            x = 10; //var x=10; 变量提升到最顶层
        }
        return x;
    }
    f(false);//undefined 

非常感谢热心小伙伴的指点, 楼上说的变量提升就是这个意思吧 这应该就是程序走的步骤

因为x没定义啊
false等同于

function f(shouldInitialize: boolean) {
    return x;
}

这是作用域的问题。
用了var关键字,变量作用域提升,true的时候,if外面可见x,false的时候不走这里,外面看不到。

你可以试下let或者const,即使你true,直接报错x没定义。

泻药,这个问题,var是函数作用域也就是function级别。{}限制不了它的域,存在变量提示。
也就是js解释器在解释的时候第一遍会遍历function里的变量做预声明,然后再按行解析。
这道题,程序进入函数后:

  1. 先声明x,但是不赋值,为undefined
  2. 然后解析if,发现为false,那么var x = 10; 这句不执行,直接执行 return x。然后就是undefined

你可以对比下面两段代码

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 作用域是块也就是{},解析阶段会报错

你这个幸好是var命中了js的awful parts
如果你试试const let,会直接报ReferenceError。

兄弟你哪个实参如果接收了false的话说明false为0 就不会走if语句内的结构了 返回的结果自然就是undefined了

该说的楼上都说了,我只是翻译一下。

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'

变量提升,尽量少用var,用let就明白咋回事了

变量提升,尽量把变量定义在代码块最前面

你的第一个问题:返回的是undefined呢?看到问题第一反应是用变量提升来帮你解答,但是看到第二个问题,你竟然问:不是应该也返回10吗?突然犹豫要不要解答第一个问题了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题