例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()执行时都是执行的匿名函数。且匿名函数中没有定义变量,改变了全局变量。
-->