在牛客网上看了一个代码,很有意思,故记录下来,先来看一下代码
<SCRIPT LANGUAGE="JavaScript">
var bb = 1;
function aa(bb) {
bb = 2;
alert(bb);
};
aa(bb);
alert(bb);
</SCRIPT>
运行结果为2,1;不是我以为的2,2
看下面的代码,
<script>
var bb = 1;
function aa() {
bb = 2;
alert(bb);
};
aa();
alert(bb);
</script>
运行结果是我们所想的2,2
第二个代码很好理解,在函数内没有用var声明变量,即为全局变量,即覆盖了函数外的同名全局变量bb=1;所以两次alert都是2;
那个第一个代码块怎么理解呢?
函数体内,bb并没有使用var来定义,按理说这个bb在预处理的时候应该是window的属性。但在这里,函数声明的时候,带了一个参数bb,也就是相当于在函数体内声明了var bb。所以,函数里的bb就是函数活动对象的属性。所以函数执行时会输出2。函数执行完后,函数的活动对象被销毁,也就是局部的这个bb被删除了,执行流进入到window,再输出bb,值就是1了。
即如果函数的参数名和全局变量相同的话,在函数内部不写var,里面的变量会认为是形参的调用,而不会覆盖全局变量
我们需要记住:“ECMA中所有函数的参数都是按值传递的”。
值传递:把一个值类型(也叫基本类型)传递给另一个变量时,其实是分配了一块新的存储空间,因此就本题来说,在内部改变这个值时,其实在函数外部对这个值没有影响。