全局变量与局部变量

js中局部变量只对局部的函数起作用,执行完该函数自动删除局部变量,但这段代码中第二个函数里面变量sum的值和第一个sum值是一样的,这是怎么回事儿呢?不应该是0么?

<html>
<head>
<title>全部变量和局部变量再探</title>
</head>
<body>
<button onclick="myFunction()">局部变量</button>
<br><br>
<button onclick="myFunctions()">局部变量</button>
<script>
var sum=0;
function myFunction(){
var str1=123;
var str2=345;
sum=str1+str2;
alert(sum);//值为468
}
function myFunctions(){
alert(sum);//值为468
}
alert(sum);//值为0
</script>
</body>
</html>
阅读 2.7k
5 个回答
var sum=0;
function myFunction(){
  var str1=123;
  var str2=345;
  sum=str1+str2;
  alert(sum);      // 第一个 alert 值为 468
}
function myFunctions(){
  alert(sum);      // 第二个 alert 值可能是 0,也可能是 468
}
alert(sum);        // 第三个 alert 值为 0

上面是答案,道理如下:

  1. 程序顺序执行,两个函数定义不会执行,因为函数绑定到按钮的 click 事件上,事件不触发,函数不执行;
  2. 程序会直接执行第三个 alert,这个时候 sum 是 0,因为,页面出来了,你还没有点击按钮,程序已经弹出 alert 框了,你手点击第一个按钮的速度不可能比程序执行的速度快,这就是第三个 alert 是 0 的原因;
  3. 当你点击第一个按钮时 myFunction() 函数执行,sum 值改变,第一个 alert 是 468;
  4. 关键是为什么第二个 alert 可能是 0,也可能是 468。这完全取决于你点击按钮的顺序。如果你一上来,点击第二个按钮,而不点击第一个按钮,则 sum 是 0。只有你先点击过第一个按钮后,再点击第二个按钮,这个时候 sum 被修改了,alert 就显示为 468;

第一个函数内是对全局变量赋值了吧,确定最后一个输出是0吗

主要是第一和第二个函数都是调用全局的sum变量,你应该是首先点击了第一个函数然后给全局的sum赋值为468,然后再调用第二个函数的时候里面的sum变量依旧是全局的sum所以结果还是468,如果你第一次调用的是第二个函数的话sum的值才是0.

上面的答案讲的很清楚啦,说到底,题主你定义的不是局部变量,而是全局变量

如果你这样写:

    // 这里的sum是全局变量
    var sum = 0
    function myFunction(){
        // 这里的sum是局部变量
        var sum = 0;
        var str1 = 123;
        var str2 = 345;
        // 首先找到的是局部变量,然后赋值
        sum = str1+str2;
        alert(sum);   // 468
    }
    
    function myFunctions(){
        alert(sum)  // 0
    }
    
    alert(sum)  // 0

这样就得到题主想要的效果啦

sum=str1+str2; //这个改变的还是外面的sum

var sum = str1+str2; //这样下面函数取得才是 0

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