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吗


牛魔王的故事
浏览 633回答 10
10回答

慕桂英4014372

function f(params){        var x;        if(params){            x = 10; //var x=10; 变量提升到最顶层        }        return x;    }    f(false);//undefined 非常感谢热心小伙伴的指点, 楼上说的变量提升就是这个意思吧 这应该就是程序走的步骤

慕盖茨4494581

这是作用域的问题。用了var关键字,变量作用域提升,true的时候,if外面可见x,false的时候不走这里,外面看不到。你可以试下let或者const,即使你true,直接报错x没定义。

ITMISS

这个问题,var是函数作用域也就是function级别。{}限制不了它的域,存在变量提示。也就是js解释器在解释的时候第一遍会遍历function里的变量做预声明,然后再按行解析。这道题,程序进入函数后:先声明x,但是不赋值,为undefined然后解析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。

慕侠2389804

兄弟你哪个实参如果接收了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'

慕尼黑5688855

(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就明白咋回事了

慕神8447489

你的第一个问题:返回的是undefined呢?看到问题第一反应是用变量提升来帮你解答,但是看到第二个问题,你竟然问:不是应该也返回10吗?突然犹豫要不要解答第一个问题了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript