为了账号安全,请及时绑定邮箱和手机立即绑定

js 局部变量和全局变量

js 局部变量和全局变量

牛魔王的故事 2019-03-14 18:15:17
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吗
查看完整描述

10 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

function f(params){

        var x;

        if(params){

            x = 10; //var x=10; 变量提升到最顶层

        }

        return x;

    }

    f(false);//undefined 

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


查看完整回答
反对 回复 2019-04-09
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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

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


查看完整回答
反对 回复 2019-04-09
?
ITMISS

TA贡献1871条经验 获得超8个赞

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


查看完整回答
反对 回复 2019-04-09
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-04-09
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-04-09
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

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


function f(shouldInitialize: boolean) {

    var x;//这就是所谓的声明提升

    if (shouldInitialize) {

        x = 10;

    }


    return x;

}


f(true);  // returns '10'

f(false); // returns 'undefined'


查看完整回答
反对 回复 2019-04-09
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

(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'


查看完整回答
反对 回复 2019-04-09
?
喵喔喔

TA贡献1735条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-04-09
?
慕神8447489

TA贡献1780条经验 获得超1个赞

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


查看完整回答
反对 回复 2019-04-09
  • 10 回答
  • 0 关注
  • 632 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信