js中关于局部变量与函数的两点疑问

请教各位大佬,这个change函数不是返回num了吗,就算function里面的num是局部变量,跟上面的num没任何关系,但是return了啊....为什么输出的还是1

    var num = 1;
    function change (number) {
        var num = number;
        return num;
    };
    change (2);
    console.log(num)//事实输出1,期望是2

当然上面的代码改一下就能输出2,这是变量提升了

    var num = 1;
    function change (number) {
        num = number;
        return num;
    };
    change (2);
    console.log(num)//事实输出2,期望是2

去掉return num也行

    var num = 1;
    function change (number) {
        num = number;
    };
    change (2);
    console.log(num)//事实输出2,期望是2

那么问题就是
1.为什么第一个代码块期望输出是2,事实输出是1?
2.第二个代码块和第三个代码块function里面的num实际上是全局变量,那么加return num意义何在呢?

阅读 1.8k
2 个回答

这三段代码都是完全不同的

问题都过于基础, 你需要去补充基础知识, 最好成体系的阅读一下相关书籍.

问题1:
你的例子1这里的期望输出就是1, 期望输出2是错误的, 原因就是作用域的问题.
change声明的那个 num 只拥有局部作用域, 在函数运行结束时即销毁, 并且对它的赋值或其它任何操作都不会影响到全局变量, 所以你的实际上例子1中的全局的 num 变量从未被修改.
例子2中, 你的 change并没有新声明变量, 所以访问的是全局的 num 变量, 它被修改为2了, 自然你在后面访问全局变量 num 的时候是2了
(所以这两个程序看起来只差了个 var, 实际上是完全不同的)

问题2:
函数是否有返回值完全取决于你的需求, 你的第三个例子就是为了改 num 这个全局变量而没有实质意义上的功能才冒出来的一个莫名其妙的问题...

PS: 全局变量因为各个函数都可以访问所以对它的管理可能会失控, 因此在程序中使用全局变量都需要极其谨慎, 并且尽量避免. 虽然现在来说这句话对你来说可能还只会产生困惑, 就当打个预防针吧.

第一段里面虽然有两个num,但是这两个num都是使用var申明的,所以他们是两个完全不一样的东西了。第一个是全局变量的num,第二个是局部变量的num,造成这种误解就是因为你给了他们一个一样的名字。如果你要在函数里面使用局部变量,不要用同名变量!!在实际项目中这种情况是不允许的,一些list工具还会报错,所谓很多难以理解的东西,都是人为制造的误解。你如果把函数里面的var num改为var num2,瞬间就清晰了。

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