局部变量与全局变量相关例题

235 阅读2分钟

例1:

var a = 10;
function test(a) {
    a -= 3;            
}
test(a);     
console.log(a);
  <!-- test(a)是带参数进入函数的,但是在函数里没有return a,且没有把a重新赋值a=test(a),所以下面打印a依然为10。
  如若以带参数执行函数且想拿到改变后的a,需在函数中添加return a;test(a)改为a=test(a); -->

例2:

var a = 10;
function test() {
    a -= 3;
}
test();
console.log(a);
<!-- 这种情况未带参数进入,在函数中执行改变的直接是全局变量,不需要return和重新赋值就改变了全局的值 -->

例3:

function fn1() {
  alert(1);
}
alert(fn1());  //1  undefined; 
<!-- 首先执行fn1,打印了1,随后执行了alert(fn1()),由于fn1没有return返回值,所以alert弹出的fn1()执行结果为undefined -->

例4:

for (var i = 0; i < 10; i++) {}
document.write(i);  //10

例5:

var num1 = 1;
function testf1() {
  num1 = 2;
  var num1;
  alert(num1);
}
function testf2() {
  alert(num1);
}
testf1();
testf2();
<!-- 
在函数里的变量,只要加了var,无论是在变量赋值之前还是之后执行,都相当于最先执行。相当于var了一个局部变量。
所以在testf1里改变的只是局部变量,全局变量不变。
 -->

例6:

var x = 0;
var f = function () {
  x = 1;
};
f();
console.log(x); //1
function f() {
  x = 2;
}
f();
console.log(x); //1 
<!--
两次打印出来的都为1,涉及到函数的两种创建方法。普通函数的创建是在执行到script脚本的时候就进入堆中,但是匿名函数创建时,只有执行到匿名函数时,函数才会进入到堆中。
该题下面创建出的函数被上面匿名函数创建时所覆盖,所以两次f()执行时都是执行的匿名函数。且匿名函数中没有定义变量,改变了全局变量。
 -->